我有3个数组保存整数值。一个4维数组,一个2维数组,一个1维数组。但是每个数组的元素总数是相等的。我将在控制台上打印这些数组中的所有元素。哪个打印最快?还是等于打印次数?
int[,,,] Q = new int[4, 4, 4, 4]; int[,] W = new int[16,16]; int[] X = new int[256];
iklwldmw1#
除非我遗漏了什么,否则有两种主要的方法可以迭代多维数组。第一个是:
int[,] W = new int[16,16]; for(int i = 0; i < 16; i++) { for(int j = 0; j < 16; j++) Console.WriteLine(W[i][j]); }
此方法比迭代一维数组要慢,唯一的区别是,对于每16个成员,您需要开始外部循环的新迭代并重新启动内部循环。第二个是:
for(int i = 0; i < 256; i++) { Console.WriteLine(W[i / 16][i % 16]); }
这种方法比较慢,因为每次迭代都需要计算(i/16)和(i % 16)。忽略迭代因子,还存在每次迭代访问另一个指针所花费的时间。就我对布尔函数 * 的了解而言,给定两组两个整数,其中一个整数较大,但在内存中的大小相同(与c#中int类型的所有数字的情况一样),计算两个集合的加法所需的时间将完全相同(就像时钟滴答的次数一样,但我并不期望每个偶然遇到这个问题的人都熟悉它)。用于计算数组成员的地址的时间不取决于其索引有多大。因此,总而言之,除非我遗漏了什么或者我比我想象的要粗糙,否则有一个因素肯定会延长在多维数组上迭代所花费的时间(用于访问的额外指针),另一个因素保证可以实现相同的效果,但您可以选择以下两个选项之一(多个循环或循环的每次迭代都需要额外的计算),并且不存在会减慢一维数组方法的因素(超长索引没有"税")。
这使得它对于一维数组有两个因素,而对于多维数组则没有。因此,我假设一维数组会更快也就是说,你使用的是C#,所以你可能并不是真的在寻找一个微不足道的优势,或者你会使用一种低级语言。如果你是,你可能应该要么切换到一种低级语言,要么真正考虑一下你是否在以最好的方式做你正在尝试做的事情(我能想到的唯一一种情况是,如果您在代码中加载了一个完整的100万条记录加数据库,这是非常糟糕的做法)。然而,如果您刚刚开始使用C#,那么您可能只是想多了。不管是哪一个,这是一个有趣的假设,所以谢谢你问它!
1条答案
按热度按时间iklwldmw1#
除非我遗漏了什么,否则有两种主要的方法可以迭代多维数组。
第一个是:
此方法比迭代一维数组要慢,唯一的区别是,对于每16个成员,您需要开始外部循环的新迭代并重新启动内部循环。
第二个是:
这种方法比较慢,因为每次迭代都需要计算(i/16)和(i % 16)。
忽略迭代因子,还存在每次迭代访问另一个指针所花费的时间。
就我对布尔函数 * 的了解而言,给定两组两个整数,其中一个整数较大,但在内存中的大小相同(与c#中int类型的所有数字的情况一样),计算两个集合的加法所需的时间将完全相同(就像时钟滴答的次数一样,但我并不期望每个偶然遇到这个问题的人都熟悉它)。用于计算数组成员的地址的时间不取决于其索引有多大。
因此,总而言之,除非我遗漏了什么或者我比我想象的要粗糙,否则有一个因素肯定会延长在多维数组上迭代所花费的时间(用于访问的额外指针),另一个因素保证可以实现相同的效果,但您可以选择以下两个选项之一(多个循环或循环的每次迭代都需要额外的计算),并且不存在会减慢一维数组方法的因素(超长索引没有"税")。
这使得它对于一维数组有两个因素,而对于多维数组则没有。
因此,我假设一维数组会更快
也就是说,你使用的是C#,所以你可能并不是真的在寻找一个微不足道的优势,或者你会使用一种低级语言。如果你是,你可能应该要么切换到一种低级语言,要么真正考虑一下你是否在以最好的方式做你正在尝试做的事情(我能想到的唯一一种情况是,如果您在代码中加载了一个完整的100万条记录加数据库,这是非常糟糕的做法)。
然而,如果您刚刚开始使用C#,那么您可能只是想多了。
不管是哪一个,这是一个有趣的假设,所以谢谢你问它!