众所周知,如果您从光盘读取数据,那么您就是IO绑定的,并且您可以比从光盘读取数据更快地处理/解析读取数据.
但这种常识(神话?)并没有反映在我的测试中.当我读取带有double和int的文本文件时,每行以空格分隔,我比物理光盘速度慢得多(因子6).文本文件如下所示
1,1 0
2,1 1
3,1 2
Run Code Online (Sandbox Code Playgroud)
更新 我在一次读取时使用完整缓冲区执行ReadFile时包含了PInvoke性能,以获得"真实"性能.
结果是
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 …