|
|
1
6
在对代码进行了一段时间的测试之后,我的最佳猜测是,正如在评论中所说的,您在当前的解决方案中遇到了很多缓存未命中的情况。台词:
可能会迫使编译器将新缓存线完全加载到内存中,并替换当前内容。在这种情况下,分支预测也可能存在一些问题。这是高度依赖硬件的,我不知道有什么真正好的解决方案可以在任何解释语言中测试这一点(在硬件设置和众所周知的编译语言中也很难)。 在经历了反汇编之后,您可以清楚地看到,您还引入了一系列新指令,这可能会进一步增加前面提到的问题。
总的来说,我建议你重新编写完整的算法,因为有更好的地方可以提高性能,而不是在这一个小任务中挑拣拣。这就是我建议的优化(这也提高了可读性):
编辑: 为什么我建议反转为循环?通过对代码的重新排列:
我来自这样的运行时:
要创建这样的运行时:
你还觉得不值得一试吗?我在这里保存了几个数量级,几乎消除了
编辑2 :获取深入的答案。我对为什么会出现这个问题的最好解释是,您交叉引用了缓存线。在这些行中:
你加载了一个巨大的数据集。这远远大于缓存线本身。因此,它很可能需要在每次迭代时都从内存中新加载到新的缓存线中(替换旧内容)。如果我没记错的话,这也被称为“缓存抖动”。感谢@mjwills在评论中指出这一点。 另一方面,在我建议的解决方案中,只要内部循环不超过其边界,缓存线的内容就可以保持活动状态(如果使用这种内存访问方向,这种情况会少很多)。 这是最贴切的解释,解释了为什么me代码运行得那么快,它还支持这样一种假设,即您的代码存在严重的缓存问题。 |
|
|
A B · C#Excel自动调整列避免长文本时出错 1 年前 |
|
|
Megrez7 · C#ToArray转换合并为一行,导致数组元素更改 1 年前 |
|
Aycon · 在工厂方法中释放部分创建的对象的正确方法是什么? 1 年前 |
|
|
Sei · Avalonia/WPF将路由器传递到控制模板 1 年前 |