int从解析数据时string,有没有办法使用ReadOnlySpan<char>?喜欢int.Parse(str.AsSpan().Slice(2,3))
因为如果 int 数据在字符串的中间,比如"Humans have 206 bones",那么我必须先创建一个子字符串,然后将它传递给int.Parse(). Span在这种情况下,使用似乎是合乎逻辑的。
是的,这是可能的(我使用了 .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,解析int从string通过这个代码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)