C#中的大型算术算术

Ann*_*naR 10 c# arrays

哪个是在c#中存储2D数组的最佳方法,以便在对数组中的元素执行大量算术时优化性能?

我们有大的(大约1.5G)数组,例如我们想要逐个元素地相乘.表现至关重要.完成此操作的上下文是在c#中.有没有智能的方法来存储数组并迭代它们?我们可以用非托管C++编写这些部分吗?这会真的提高性能吗?数组需要可以访问c#程序的其余部分.

目前(在c中)阵列存储为单个长向量.我们对数组中的每个元素执行计算并覆盖旧值.对于向量中的每个元素,计算通常是唯一的.

时序实验表明,在C#中作为数组存储和迭代数据比将其存储为2D数组要慢.我想知道是否有更好的方法来处理数据.所执行的特定算术与该问题无关.

Jas*_*son 8

安娜,

这是一个很好的页面,讨论传统科学编程语言(fortran,C++)和c#之间的性能差异.

http://msdn.microsoft.com/en-us/magazine/cc163995.aspx

根据文章C#,当使用矩形阵列(2d)时可以是非常好的表演者.下面的图表显示了锯齿状阵列(数组数组)和矩形数组(多维)数组之间的性能差异.

alt text http://i.msdn.microsoft.com/cc163995.fig08.gif

我建议自己试验,并使用VS 2008中的性能分析进行比较.

如果使用C#"足够快",那么您的应用程序将更容易维护.

祝好运!

  • 该图中显示的结果来自.Net 1.1.锯齿状阵列实际上比.Net 3和4中的多维阵列更快,如下所示:http://www.codeproject.com/KB/cross-platform/BenchmarkCppVsDotNet.aspx (2认同)

Cam*_*and 5

为了获得最佳数组性能,请确保您使用的是索引为 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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑Drat!没注意到你说的是二维数组。这个技巧不适用于多维数组,所以我不确定它会有多大帮助。尽管您可以通过对数组索引执行一些算术将任何数组转换为单维数组。只取决于您是否关心索引数组或迭代数组时的性能影响。