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

时间:2019-05-11 15:49:46

标签: c#

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

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

1 个答案:

答案 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 |