在C#中使用二维数组(type[,]
)或数组()数组会更高效type[][]
吗?
特别是对于初始分配和项目访问
当然,如果一切都失败了......试试吧!以下给出(在"发布"中,在控制台):
Size 1000, Repeat 1000 int[,] set: 3460 int[,] get: 4036 (chk=1304808064) int[][] set: 2441 int[][] get: 1283 (chk=1304808064)
因此,至少在此测试中,锯齿状阵列更快.有趣!然而,这是一个相对较小的因素,所以我仍然会坚持用更好的描述我的要求.除了某些特定(高CPU /处理)方案之外,可读性/可维护性应该优于小的性能增益.不过,由你决定.
请注意,此测试假定您访问阵列的次数比创建时更频繁,因此我没有包含创建时间,我希望矩形更快,除非内存高度分散.
using System; using System.Diagnostics; static class Program { static void Main() { Console.WriteLine("First is just for JIT..."); Test(10,10); Console.WriteLine("Real numbers..."); Test(1000,1000); Console.ReadLine(); } static void Test(int size, int repeat) { Console.WriteLine("Size {0}, Repeat {1}", size, repeat); int[,] rect = new int[size, size]; int[][] jagged = new int[size][]; for (int i = 0; i < size; i++) { // don't cound this in the metrics... jagged[i] = new int[size]; } Stopwatch watch = Stopwatch.StartNew(); for (int cycle = 0; cycle < repeat; cycle++) { for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { rect[i, j] = i * j; } } } watch.Stop(); Console.WriteLine("\tint[,] set: " + watch.ElapsedMilliseconds); int sum = 0; watch = Stopwatch.StartNew(); for (int cycle = 0; cycle < repeat; cycle++) { for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { sum += rect[i, j]; } } } watch.Stop(); Console.WriteLine("\tint[,] get: {0} (chk={1})", watch.ElapsedMilliseconds, sum); watch = Stopwatch.StartNew(); for (int cycle = 0; cycle < repeat; cycle++) { for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { jagged[i][j] = i * j; } } } watch.Stop(); Console.WriteLine("\tint[][] set: " + watch.ElapsedMilliseconds); sum = 0; watch = Stopwatch.StartNew(); for (int cycle = 0; cycle < repeat; cycle++) { for (int i = 0; i < size; i++) { for (int j = 0; j < size; j++) { sum += jagged[i][j]; } } } watch.Stop(); Console.WriteLine("\tint[][] get: {0} (chk={1})", watch.ElapsedMilliseconds, sum); } }