首先,对不起我糟糕的英语。
我写了一个程序,用于找到在函数中动态创建单位矩阵的最佳方法。我有三个用于创建单位矩阵的函数。第一功能和第二功能几乎相同。它们之间只有区别在于:第一个函数使用memset
函数用零填充数组,第二个函数使用内置函数。最后一个函数只使用条件语句在一个循环中生成所有内容。我在想使用条件语句会不必要地减慢功能。
代码的性能比较结果很有趣,与我的所有猜测相反:
1: 1194
2: 551
3: 440
使用条件语句的最后一个函数如何比其他函数更快? memset
是一个很久以来开发的函数,它如何比我的内置代码慢?
来源:
#include <stdio.h>
#include <string.h>
#include <time.h>
typedef float MAT4[4][4];
void identityMatrix_1(MAT4 matrix)
{
memset(matrix, 0, sizeof(matrix[0][0]) * 4 * 4);
for(int I = 0; I < 4; I++)
{
matrix[I][I] = 1;
}
}
void identityMatrix_2(MAT4 matrix)
{
for(int X = 0; X < 4; X++)
{
for(int Y = 0; Y < 4; Y++)
{
matrix[X][Y] = 0;
}
}
for(int I = 0; I < 4; I++)
{
matrix[I][I] = 1;
}
}
void identityMatrix_3(MAT4 matrix)
{
for(int X = 0; X < 4; X++)
{
for(int Y = 0; Y < 4; Y++)
{
if(X == Y)
{
matrix[X][Y] = 1;
}
else
{
matrix[X][Y] = 0;
}
}
}
}
void printMAT4(MAT4 matrix)
{
for(int X = 0; X < 4; X++)
{
for(int Y = 0; Y < 4; Y++)
{
printf("%f ",matrix[X][Y]);
}
printf("\n");
}
}
clock_t startTime, endTime;
int main(void) {
MAT4 i1, i2, i3;
startTime = clock();
for(int I = 0; I < 10000; I++)
identityMatrix_1(i1);
endTime = clock();
printf("1: %li \n", endTime - startTime);
startTime = clock();
for(int I = 0; I < 10000; I++)
identityMatrix_2(i2);
endTime = clock();
printf("2: %li \n", endTime - startTime);
startTime = clock();
for(int I = 0; I < 10000; I++)
identityMatrix_3(i3);
endTime = clock();
printf("3: %li \n", endTime - startTime);
//for optimizing the code correctly.
printMAT4(i1);
printMAT4(i2);
printMAT4(i3);
return 0;
}
修改:我不优化该计划。
编辑:我根据答案编辑了程序并优化了程序。
优化结果(-O3):
1: 188
2: 0
3: 0
答案 0 :(得分:1)
如果在打开优化的情况下编译它,编译器可能会注意到您从未从矩阵中读取过,因此只删除您的identityMatrix函数是有效的。
如果您没有关闭优化编译,编译器将不会优化您的功能,因此您将获得时间,但它们没有意义,因为它们与您启用优化时的结果有很大不同。 / p>