在时间(缓存性能)方面,嵌套循环在迭代2D阵列中的哪一个排序更有效?为什么?
int a[100][100];
for(i=0; i<100; i++)
{
for(j=0; j<100; j++)
{
a[i][j] = 10;
}
}
Run Code Online (Sandbox Code Playgroud)
要么
for(i=0; i<100; i++)
{
for(j=0; j<100; j++)
{
a[j][i] = 10;
}
}
Run Code Online (Sandbox Code Playgroud) 请参阅以下代码段:
Long first_begin = System.currentTimeMillis();
// first nested loops
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 1000000; j++) {
// do some stuff
}
}
System.out.println(System.currentTimeMillis() - first_begin);
// second nested loops
Long seconde_begin = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
for (int j = 0; j < 10; j++) {
// do some stuff
}
}
System.out.println(System.currentTimeMillis() - seconde_begin);
Run Code Online (Sandbox Code Playgroud)
我想知道为什么第一个嵌套循环比第二个嵌套循环慢?
问候!
重要的提示!:我很抱歉,当我第一次提出这个问题时,我意外地将变量j从1开始,我做了修正.
更新:循环中没有任何特定的逻辑,我只是做一些测试,实际上这是一个在面试中提出的问题,面试官提示我改变循环的顺序以获得更好的性能.顺便说一句,我使用的是JDK1.5.经过一些测试我现在更加困惑,因为程序的结果不一致---有时第一个循环比第二个循环运行得快,但大部分时间它比第二个循环运行得慢.
您不应该将对象指针视为OOP语言(包括C++)中原始二进制数据的指针.对象"超过"它们的表示.
因此,例如,swap通过交换字节来处理两个对象是不正确的:
template<class T>
void bad_swap(T &a, T &b) // Assuming T is the most-derived type of the object
{
char temp[sizeof(T)];
memcpy(temp, &a, sizeof(a));
memcpy(&a, &b, sizeof(b));
memcpy(&b, temp, sizeof(temp));
}
Run Code Online (Sandbox Code Playgroud)
然而,唯一的情况是,我可以想象这个导致问题的快捷方式是当一个对象包含一个指向自身的指针时,我很少(从不?)在实践中看到它; 但是,也可能是其他情景.
swap如果你执行按位交换,什么是正确会破坏的实际(真实世界)示例?
我可以很容易地用自我指针提出人为的例子,但我想不出任何真实的例子.