是否可以使用 ReadOnlySpan<char> 从字符串中解析 int

Muz*_*zib 4 c#

int从解析数据时string,有没有办法使用ReadOnlySpan<char>?喜欢int.Parse(str.AsSpan().Slice(2,3))

因为如果 int 数据在字符串的中间,比如"Humans have 206 bones",那么我必须先创建一个子字符串,然后将它传递给int.Parse(). Span在这种情况下,使用似乎是合乎逻辑的。

Pet*_*art 7

是的,这是可能的(我使用了 .NET Core 3.0):

var text = "Humans have 206 bones";
ReadOnlySpan<char> asSpan = text.AsSpan();
var number = int.Parse(asSpan.Slice(12, 3));
Run Code Online (Sandbox Code Playgroud)

我做了一些检查,以BenchmarkDotNet,解析intstring通过这个代码VS需要大约60-80%的时间SubString

|          Method |       N |             Mean |           Error |          StdDev | Ratio |
|---------------- |-------- |-----------------:|----------------:|----------------:|------:|
|       Substring |       1 |         31.14 ns |       0.0422 ns |       0.0374 ns |  1.00 |
| AsSpanThenSlice |       1 |         25.34 ns |       0.0519 ns |       0.0485 ns |  0.81 |
|     AsSpanInOne |       1 |         19.51 ns |       0.0544 ns |       0.0425 ns |  0.63 |
|                 |         |                  |                 |                 |       |
|       Substring |    1000 |     31,662.81 ns |      48.0289 ns |      44.9262 ns |  1.00 |
| AsSpanThenSlice |    1000 |     25,715.43 ns |      20.8666 ns |      17.4245 ns |  0.81 |
|     AsSpanInOne |    1000 |     18,344.96 ns |      15.3018 ns |      12.7777 ns |  0.58 |
|                 |         |                  |                 |                 |       |
|       Substring | 1000000 | 68,811,376.67 ns | 135,815.2457 ns | 127,041.6651 ns |  1.00 |
| AsSpanThenSlice | 1000000 | 44,843,871.11 ns |  97,723.9653 ns |  91,411.0578 ns |  0.65 |
|     AsSpanInOne | 1000000 | 38,622,410.65 ns |  27,490.1451 ns |  22,955.5162 ns |  0.56 |
Run Code Online (Sandbox Code Playgroud)

  • 更令人印象深刻的是分配内存的减少。Substring 分配,而 Span 不分配。如果您经常这样做,垃圾收集时间将会大大减少。 (2认同)