相关疑难解决方法(0)

如何在C#中解析文本文件并被绑定?

众所周知,如果您从光盘读取数据,那么您就是IO绑定的,并且您可以比从光盘读取数据更快地处理/解析读取数据.

但这种常识(神话?)并没有反映在我的测试中.当我读取带有double和int的文本文件时,每行以空格分隔,我比物理光盘速度慢得多(因子6).文本文件如下所示

1,1 0
2,1 1
3,1 2
Run Code Online (Sandbox Code Playgroud)

更新 我在一次读取时使用完整缓冲区执行ReadFile时包含了PInvoke性能,以获得"真实"性能.

  • ReadFile性能 - ReadFileIntoByteBuffer
  • StringReader.ReadLine性能 - CountLines
  • StringReader.Readline unsafe perf - ParseLinesUnsafe
  • StringReader.Read unsafe char buf - ParseLinesUnsafeCharBuf
  • StringReader.ReadLine +解析性能 - ParseLines

结果是

Did native read 179,0MB in                    0,4s, 484,2MB/s
Did read 10.000.000 lines in                  1,6s, 112,7MB/s
Did parse and read unsafe 179,0MB in          2,3s,  76,5MB/s
Did parse and read unsafe char buf 179,0MB in 2,8s,  63,5MB/s
Did read and parse 179,0MB in                 9,3s,  19,3MB/s
Run Code Online (Sandbox Code Playgroud)

虽然我确实尝试跳过ParseLinesUnsafeCharBuf中的字符串构造开销,但它仍然比每次分配新字符串的版本慢得多.它仍然比最简单的解决方案的原始20 MB好很多,但我认为.NET应该能够做得更好.如果remoe是解析字符串的逻辑,我确实得到258,8 MB/s,这非常好,接近本机速度.但我没有看到使用不安全代码的方法使我的解析更简单.我必须处理不完整的线条,这使得它非常复杂.

更新 从数字中可以清楚地看出,一个简单的string.split已经花费太多了.但是StringReader也花了不少钱.高度优化的解决方案如何看起来更接近真实的光盘速度?我已经尝试了许多不安全的代码和char缓冲区的方法,但性能提升可能是30%,但我不需要大小的数量级.我可以100MB/s的解析速度.这应该可以通过托管代码实现,还是我错了?

用C#解析的速度是否比我从硬盘读取的速度快?它是Intel …

c# performance file-io

7
推荐指数
1
解决办法
3015
查看次数

标签 统计

c# ×1

file-io ×1

performance ×1