2016-09-24 2 views
-1

Во-первых, извините за мой страшный английский.аномалия производительности при создании идентичной матрицы

Я написал программу для поиска наилучшего способа динамического создания идентификационной матрицы в функции. У меня есть три функции для создания идентичной матрицы. Первая функция и вторая функция почти одинаковы. Только разница между ними: Функция первой функции 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 
+0

Какой компилятор вы используете и какие флаги существуют? –

+0

Если вы не включите оптимизацию кода, это похоже на просмотр ходьбы Usain Bolt. Не очень быстро и крайне неинтересно. –

+0

Я использую GCC. Я оптимизирую его. –

ответ

1

Если вы собираете это с оптимизаций включена, компилятор, вероятно, заметит, что вы никогда не читали из вашей матрицы и, как таковая, она действительна только удалите свои функции identityMatrix.

Если вы не компилируете с выключенными оптимизациями, компилятор не будет оптимизировать ваши функции, поэтому вы получите тайминги, но они бессмысленны, потому что они сильно отличаются от того, что вы получите при включенной оптимизации.

+0

Я редактирую программу в соответствии с вашим ответом. И оптимизируйте его. –

Смежные вопросы