Во-первых, извините за мой страшный английский.аномалия производительности при создании идентичной матрицы
Я написал программу для поиска наилучшего способа динамического создания идентификационной матрицы в функции. У меня есть три функции для создания идентичной матрицы. Первая функция и вторая функция почти одинаковы. Только разница между ними: Функция первой функции memset
Функция для заполнения массива нулями, вторая функция делает это встроенным. Последняя функция делает все только в одном цикле с использованием условных операторов. Я думал, что использование условных операторов будет замедлять работу без необходимости.
Performance сравнение результата кода было интересно, реверс всех моих догадок:
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;
}
Edit: Я не оптимизировать программу.
Редактировать: Я отредактировал программу в соответствии с ответами и оптимизировал программу.
Оптимизированные результаты (-O3):
1: 188
2: 0
3: 0
Какой компилятор вы используете и какие флаги существуют? –
Если вы не включите оптимизацию кода, это похоже на просмотр ходьбы Usain Bolt. Не очень быстро и крайне неинтересно. –
Я использую GCC. Я оптимизирую его. –