首页 > 解决方案 > 在 C# 中实现莫顿 Z 曲线的有效性

问题描述

我正在研究一个元胞自动机,它涉及每秒多次读取/写入二维数组,特别是相邻的单元格。我了解数据局部性减少了缓存未命中,并且在我的情况下应该会大大提高性能,所以我听说过。我决定实现一个morton z-curve,它似乎最快地将其在“z-curve 数组”中的索引转换为 2d 数组中相应的 x,y 坐标。但是,我已经分析了许多算法,但似乎没有一个能够访问数组中的每个单元格并在接近c# 支持的标准二维数组类型的任何地方编辑其邻居(最多半速,并且最差速度的 1/10)。

我已经尝试过越来越快的算法将 x/y 坐标转换为 z 索引,但强大的二维数组仍然更快。这些包括“魔术位”和查找表方法,如下所示:here。这没有道理。缓存未命中和数据局部性是否根本不是什么大问题,并且被 z 数组和 2d 数组之间转换所需的处理所抵消?请记住转换实际上是多么简单,只需将 x 和 y 坐标的二进制文件交错即可产生 z 索引。

这是徒劳的努力吗?C# 在这种情况下根本就没有能力吗?

标签: c#arrays

解决方案


推荐阅读