c# - 使用 Span 的性能解析文本文件
问题描述
我正在尝试Span<T>
利用.NETCore 2.2来提高从文本文件中解析文本的性能。文本文件包含多行连续的数据,每行将被拆分为字段,然后每个字段都映射到一个数据类。
最初,解析例程使用传统的方法StreamReader
来读取每一行,然后使用Substring
从该行复制各个字段。
根据我所读到的内容(在 MSDN 上),除其他外,使用Span<T>
withSlice
应该更有效地执行更少的数据分配,而是byte[]
传递指向数组的指针并对其进行操作。
经过一些实验,我比较了 3 种解析文件的方法,并使用 BenchmarkDotNet 来比较结果。我发现,当使用 解析文本文件中的单行时Span
,平均执行时间和分配的内存确实要少得多。到目前为止,一切都很好。但是,当从文件中解析多于一行时,性能提升很快就会消失,以至于几乎可以忽略不计,即使是从少到 50 行也是如此。
我确定我一定错过了什么。某些东西似乎超过了Span
.
性能最好的方法WithSpan_StringFirst
如下所示:
private static byte[] _filecontent;
private const int ROWSIZE = 252;
private readonly Encoding _encoding = Encoding.ASCII;
public void WithSpan_StringFirst()
{
var buffer1 = new Span<byte>(_filecontent).Slice(0, RowCount * ROWSIZE);
var buffer = _encoding.GetString(buffer1).AsSpan();
int cursor = 0;
for (int i = 0; i < RowCount; i++)
{
var row = buffer.Slice(cursor, ROWSIZE);
cursor += ROWSIZE;
Foo.ReadWithSpan(row);
}
}
[Params(1, 50)]
public int RowCount { get; set; }
实施Foo.ReadWithSpan
:
public static Foo ReadWithSpan(ReadOnlySpan<char> buffer) => new Foo
{
Field1 = buffer.Read(0, 2),
Field2 = buffer.Read(3, 4),
Field3 = buffer.Read(5, 6),
// ...
Field30 = buffer.Read(246, 249)
};
public static string Read(this ReadOnlySpan<char> input, int startIndex, int endIndex)
{
return new string(input.Slice(startIndex, endIndex - startIndex));
}
对于任何反馈,我们都表示感谢。我在 github 上发布了一个完整的工作示例。
解决方案
推荐阅读
- javascript - 当我们运行多个 ajax 请求时如何在 Windows 中杀死 php/apache 子进程
- java - 如何在循环中的一个字符串中存储多个字符串变量输入(JAVA)
- javascript - Chrome 控制台中出现意外的标识符
- python - 如何加速简单的 CSV 数据集
- python - 对象列表排列在python中不是相互独立的
- swift - 斯威夫特:如何显示明天的日期
- php - 更改特定 woocommerce 类别存档的默认排序顺序
- python - 将 scipy.stats.spearmanr() 的输出保存到 excel 或文本
- javascript - HTML5 Canvas ~ 使用绘制元素平滑快速缩放,而不是图像 ~ 如何?
- python - 在 print() 中使用 str()