佳佳的博客
Menu
首页
《.NET Core 实战》 [No.198] 使用 Span<T> 提升处理字符串的性能
Posted by
佳佳
on 2020-03-17
IT
C#
.NET Core
《.NET Core 实战》
读书笔记
<!-- # 《.NET Core 实战》 [No.198] 使用 Span<T> 提升处理字符串的性能 --> <!-- dotnet-core-span-t --> `Span<T>` 用于操作各种 **连续分布的内存数据** 。 可以通过以下来源初始化 `Span<T>` : - **常见的托管数组** ```csharp Span<char> span = str.ToCharArray(); ``` - **栈内存中的对象** ```csharp Span<int> arr = stackalloc [] {1, 2, 3}; ``` - **本地内存指针** ```csharp // 从进程的未托管内存中分配 100 字节的内存 IntPtr native = Marshal.AllocHGlobal(100); Span<byte> nativeSpan; unsafe { nativeSpan = new Span<byte>(native.ToPointer(), 100); } ``` `Span<T>` 支持 GC 功能,不需要显示释放内存。另外 `ReadOnlySpan<T>` 是其只读版本。 字符串的处理在 C# 和 Java 中都是类似的,每次字符串的修改都会创建一个新的实例,相当耗费资源。 这里通过一个示例,对比一下使用常规方法和使用 `Span<T>` 方法操作字符串时的性能。 示例功能:截取字符串中的字符 *20* 并转换为数值。 ```csharp string str = "佳佳的博客 - 2020 - www.liujiajia.me"; Stopwatch sw1 = Stopwatch.StartNew(); for (int i = 0; i < 10000000; i++) { int v = int.Parse(str.Substring(9, 2)); } sw1.Stop(); Console.WriteLine($"常规方法:耗时 {sw1.ElapsedMilliseconds} ms"); Stopwatch sw2 = Stopwatch.StartNew(); ReadOnlySpan<char> span = str.ToCharArray(); for (int i = 0; i < 10000000; i++) { int v = 0; var subSpan = span.Slice(9, 2); for (int j = 0; j < subSpan.Length; j++) { char ch = subSpan[j]; v = (ch - '0') + v * 10; } } sw2.Stop(); Console.WriteLine($"使用Span:耗时 {sw2.ElapsedMilliseconds} ms"); ``` 使用 `str.Substring(9, 2)` 方法截取字符串每次都会产生一个新的实例,而使用 `span.Slice(9, 2)` 则不会。 运行结果如下:  --- > 购买本书 => [《.NET Core实战:手把手教你掌握380个精彩案例》][10] -- *周家安* 著 --- [10]:https://union-click.jd.com/jdc?e=&p=AyIGZRhaEwAQBFUZXBIyEgRSEl0QCxc3EUQDS10iXhBeGlcJDBkNXg9JHU4YDk5ER1xOGRNLGEEcVV8BXURFUFdfC0RVU1JRUy1OVxUBFQ5THlIQMm1AEkRdb11GZyNTK0BBZwYIbylWcHILWStaJQITBlYbXB0LFQJlK1sSMkBpja3tzaejG4Gx1MCKhTdUK1sRCxQBVxtTEQIQBlwrXBULIloNXwZBXUReEStrJQEiN2UbaxYyUGlUG1kUBhcGUBILQgUXDlMeUkBVRlUBS10XBkIABhkJRzIQBlQfUg%3D%3D (《.NET Core实战:手把手教你掌握380个精彩案例》)
版权声明:原创文章,未经允许不得转载。
https://www.liujiajia.me/2020/3/17/dotnet-core-span-t
“Buy me a nongfu spring”
« 《.NET Core 实战》 [No.199] 多个 Task 同时操作 ConcurrentBag 集合
《.NET Core 实战》 [No.94~98] 特性 »
昵称
*
电子邮箱
*
回复内容
*
(回复审核后才会显示)
提交
目录
AUTHOR
刘佳佳
江苏 - 苏州
软件工程师
梦嘉集团