【发布时间】:2020-05-22 04:15:50
【问题描述】:
/////////////////////////////////////////////////////////////
void insertion_sort_f(int *A, int s, int e) {
int j, i, tmp;
for (j = s+1; j < e; j++) {
tmp = A[j];
for (i = j - 1; i >= 0 && A[i] > tmp; i--)
A[i+1] = A[i];
A[i + 1] = tmp;
}
}
void insertion_sort_w(int *A, int s, int e) {
int j, i, tmp;
for (j = s + 1; j < e; j++) {
tmp = A[j];
i = j;
while (--i >= 0 && A[i] > tmp) {
A[i + 1] = A[i];
}
A[i + 1] = tmp;
}
}
//////////////////////////////////////////////////////////////
我用 100000 个数据测试了两种插入排序,一种使用 'for',另一种使用 'while'。 我想计算时间没有有意义的差异。 但“while”比“for”平均快 1000 毫秒。 这个结果是哪一个?
ps。 我发布了完整的代码进行解释。 https://colorscripter.com/s/56xWn0O
【问题讨论】:
-
您是否在启用编译器优化的情况下进行测试?我做了一些快速测试,两个函数之间没有显着差异。
-
@Blastfurnace 哦,你是对的!我将“调试”更改为“发布”,因此计算时间没有区别。谢谢~
-
但我仍然不知道在“调试”模式下有何不同。
-
Debug == "故意放慢速度"。在调试版本中,每次修改变量时,它都会从寄存器中获取值,并将其写入内存位置。这样调试器就可以简单地查看内存地址来找出变量的当前值。
-
我在调试模式下,编译器不会竭尽全力进行优化(例如删除不必要的操作、重新排序以提高性能)。如果你准确地写下你的代码所表达的操作序列,你会看到两个代码示例做不同的事情——即使它们对你的函数的调用者有相同的净效果。