C#中的大型数组算术
在cin中存储2D数组以优化性能时,哪种最佳方法是对数组中的元素执行大量算术运算?
我们有很大的阵列(大约1.5G),例如,我们要逐个元素地相乘。性能至关重要。完成此操作的上下文在c#中。有什么聪明的方法可以存储数组并对其进行迭代吗?我们可以用非托管C ++编写这些部分吗,这真的可以提高性能吗?其余的cprogram必须可以访问这些数组。
当前(在c中),数组存储为单个长向量。我们对数组中的每个元素执行计算并覆盖旧值。对于向量中的每个元素,计算通常是唯一的。
时序实验表明,将数据作为Cis中的数组进行存储和迭代要比将其存储为2D数组慢。我想知道是否还有更好的数据处理方式。所执行的特定算法与问题无关。
解决方案
为了获得最佳阵列性能,请确保我们使用的下标索引为0的一维阵列。
为了尽可能快地访问数组的元素,可以使用不安全的指针,如下所示:
int[] array = Enumerable.Range(0, 1000).ToArray(); int count = 0; unsafe { fixed (int* pArray = array) { for (int i = 0; i < array.Length; i++) { count += *(pArray + i); } } }
编辑德拉特!没注意到你说的是二维阵列。此技巧不适用于多维数组,因此我不确定会有多少帮助。尽管我们可以通过对数组索引进行一些算术将任何数组转换为一维数组。仅取决于我们是否关心索引数组或者遍历数组时的性能损失。
安娜
这是一个很棒的页面,讨论了传统科学编程语言(fortran,C ++)和c#之间的性能差异。
http://msdn.microsoft.com/zh-CN/magazine/cc163995.aspx
根据C#文章,在使用矩形数组(2d)时可能会表现出色。这是一张曲线图,显示锯齿状阵列(阵列的阵列)和矩形阵列(多维)的阵列之间的性能差异。
替代文字http://i.msdn.microsoft.com/cc163995.fig08.gif
我建议我们进行实验,并使用VS 2008中的性能分析进行比较。
如果使用Cis"足够快",那么应用程序将更易于维护。
祝你好运!
如果下载F#,并引用其中一个运行时库(我认为它是FSharp.PowerPack),则使用Microsoft.FSharp.Maths.Matrix。它根据我们使用的是密集矩阵还是稀疏矩阵来优化自身。
我们是按行还是按列或者同时对这两个矩阵进行迭代?我们是否总是访问附近的元素,还是对矩阵进行随机访问?
如果访问中有一些局部性,但我们没有顺序访问(例如,通常在矩阵乘法中),则可以通过以更易于缓存的方式存储矩阵来获得巨大的性能差异。
一种非常简单的方法是编写一些访问函数,以将行/列索引转换为索引,并以缓存友好的方式处理一维矩阵。
该功能应将附近的坐标分组为附近的索引。如果我们使用两种大小的幂,则可以使用莫顿阶。对于非幂数大小,通常可以只将最低的4位放入morton顺序,而对高位使用普通的索引算法。即使从坐标到索引的转换似乎是一项昂贵的操作,我们仍将获得显着的加速。
http://en.wikipedia.org/wiki/Z-order_(曲线)<-抱歉,无法链接SO不喜欢带有破折号的URL。你必须剪切粘贴。
顺便说一句,将速度提高10倍或者更多。不过,这取决于我们在矩阵上选择的算法。