从int
解析string
数据时,有没有办法使用ReadOnlySpan<char>
?像int.Parse(str.AsSpan().Slice(2,3))
因为如果int数据位于字符串的中间,例如"Humans have 206 bones"
,那么我必须先创建一个子字符串,然后将其传递给int.Parse()
。在这种情况下,使用Span
似乎是合乎逻辑的。
答案 0 :(得分:4)
是的,有可能(我使用.NET Core 3.0):
var text = "Humans have 206 bones";
ReadOnlySpan<char> asSpan = text.AsSpan();
var number = int.Parse(asSpan.Slice(12, 3));
我对BenchmarkDotNet进行了一些检查,通过此代码与int
相比,从string
解析SubString
花费了60-80%的时间。
| 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 |