我在Windows Visual Studio项目中,使用下面的简单交换排序算法尝试了不同类型的整数。 处理器是Intel。 代码已使用“最大化速度(/ O2)”进行了Release x64编译。 对应于编译设置的命令行如下:
/permissive- /GS /GL /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Fd"x64\Release\vc141.pdb" /Zc:inline /fp:precise /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oi /MD /Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /Fp"x64\Release\SpeedTestForIntegerTypes.pch" /diagnostics:classic
代码本身:
#include <ctime>
#include <vector>
#include <iostream>
void sort(int N, int A[], int WorkArray[]) // exchange sort
{
int i, j, index, val_min;
for (j = 0; j < N; j++)
{
val_min = 500000;
for (i = j; i < N; i++)
{
if (A[i] < val_min)
{
val_min = A[i];
index = i;
}
}
WorkArray[j] = A[j];
A[j] = val_min;
A[index] = WorkArray[j];
}
}
int main()
{
std::vector<int> A(400000), WorkArray(400000);
for(size_t k = 0; k < 400000; k++)
A[k] = 400000 - (k+1);
clock_t begin = clock();
sort(400000, &A[0], &WorkArray[0]);
clock_t end = clock();
double sortTime = double(end - begin) / CLOCKS_PER_SEC;
std::cout << "Sort time: " << sortTime << std::endl;
return 0;
}
< p > WorkArray
只需要在排序前保存向量。
重点是,这个排序花费了我 22.3 秒才完成。有趣的是,如果我将数组 A
、WorkArray
(都在 std::vector
中和函数 sort
的参数列表中)以及 val_min
的类型从 int
改为 size_t
,那么时间会增加到 67.4 秒!这是三倍的速度变慢!新代码如下:
#include <ctime>
#include <vector>
#include <iostream>
void sort(int N, size_t A[], size_t WorkArray[]) // exchange sort
{
int i, j, index;
size_t val_min;
for (j = 0; j < N; j++)
{
val_min = 500000U;
for (i = j; i < N; i++)
{
if (A[i] < val_min)
{
val_min = A[i];
index = i;
}
}
WorkArray[j] = A[j];
A[j] = val_min;
A[index] = WorkArray[j];
}
}
int main()
{
std::vector<size_t> A(400000), WorkArray(400000);
for(size_t k = 0; k < 400000; k++)
A[k] = 400000 - (k+1);
clock_t begin = clock();
sort(400000, &A[0], &WorkArray[0]);
clock_t end = clock();
double sortTime = double(end - begin) / CLOCKS_PER_SEC;
std::cout << "Sort time: " << sortTime << std::endl;
return 0;
}
请注意,对于函数局部变量i、j、index、N,我仍然使用类型
int
,因此在这两种情况下,只有两个算术运算符i++
和j++
需要执行相同的时间。因此,这种减速与其他原因有关。它是否与内存对齐问题或寄存器大小或其他问题有关?但最过分的部分是当我将
int
更改为unsigned int
时。无符号整数和整数占用相同的字节数,即4个(sizeof
显示)。但unsigned int
的运行时间为65.8秒!虽然第一个结果还可以接受,但第二个结果完全使我困惑!为什么运行这样一个甚至没有涉及符号检查的简单算法所需的时间差异如此显着?感谢所有回答这两个问题的人。我在哪里可以开始阅读有关这些硬件级别优化特性的更多信息?我不关心排序算法本身,它只是用于说明问题。
更新:再次强调,我在所有三种情况下都使用int作为数组索引。
main.cpp:23:16: warning: 'index' may be used uninitialized in this function [-Wmaybe-uninitialized] A[index] = WorkArray[j];
不幸的是,我目前没有MSVC来测试它。 - Mysticial