コードの実行を高速化する

記事https://blog.csdn.net/qq_34827674/article/details/109147330を参照して、それをテストするプログラムを作成してください

1.データキャッシュのヒット率を改善します(2次元配列をトラバースします)。これは正しいようです。

2.命令キャッシュのヒット率を改善します(配列をループし、配列要素を50未満に設定します。配列をソートします)。理由は不明ですが、テスト結果では速度は改善されませんでした。

手順は次のとおりです。

#include "stdio.h"
#include <time.h>
#include <sys/time.h>
#include <algorithm>
using namespace std;

#define N 1000
#define N1 10000

int main(void)
{
    struct timeval tpstart;
    struct timeval tpend;
    
    int array[N][N];
    int i,j;
    
    
    gettimeofday(&tpstart,NULL);
    for(i=0; i < N; i++)
    {
       for(j=0; j < N; j++)
       {
         array[i][j] = 1;
       }
    }
    gettimeofday(&tpend,NULL);
    printf("time:%lds,%ldms\n", tpend.tv_sec-tpstart.tv_sec, tpend.tv_usec-tpstart.tv_usec);

    gettimeofday(&tpstart,NULL);
    for(i=0; i < N; i++)
    {
       for(j=0; j < N; j++)
       {
         array[j][i] = 1;
       }
    }
    gettimeofday(&tpend,NULL);
    printf("time:%lds,%ldms\n", tpend.tv_sec-tpstart.tv_sec, tpend.tv_usec-tpstart.tv_usec);
    
    gettimeofday(&tpstart,NULL);
    for(i=0; i < N; i++)
    {
       for(j=0; j < N; j++)
       {
         array[i][j] = 1;
       }
    }
    gettimeofday(&tpend,NULL);
    printf("time:%lds,%ldms\n", tpend.tv_sec-tpstart.tv_sec, tpend.tv_usec-tpstart.tv_usec);

    gettimeofday(&tpstart,NULL);
    for(i=0; i < N; i++)
    {
       for(j=0; j < N; j++)
       {
         array[i][j] = 1;
       }
    }
    gettimeofday(&tpend,NULL);
    printf("time:%lds,%ldms\n", tpend.tv_sec-tpstart.tv_sec, tpend.tv_usec-tpstart.tv_usec);
    
    
    int array1[N1];
    printf("\n");
    for(i=0; i<N1; i++)
    {
      array1[i]=rand()%100;
      //printf("%d ",array1[i]);
    }
    printf("\n");
    
    gettimeofday(&tpstart,NULL);
    for(i=0; i<N1; i++)
    {
      if(array1[i]<50)
      {
        array1[i]=0;
      }
    }    
    sort(array1,array1+N1);
    gettimeofday(&tpend,NULL);
    printf("time:%lds,%ldms\n", tpend.tv_sec-tpstart.tv_sec, tpend.tv_usec-tpstart.tv_usec);
    //printf("\n");
    //for(i=0; i<N1; i++)
    //{
      //printf("%d ",array1[i]);
    //}
    //printf("\n");

    
    printf("\n");
    for(i=0; i<N1; i++)
    {
      array1[i]=rand()%100;
      //printf("%d ",array1[i]);
    }
    printf("\n");
    
    gettimeofday(&tpstart,NULL);
    sort(array1,array1+N1);
    for(i=0; i<N1; i++)
    {
      if(array1[i]<50)
      {
        array1[i]=0;
      }
    }    
    gettimeofday(&tpend,NULL);
    printf("time:%lds,%ldms\n", tpend.tv_sec-tpstart.tv_sec, tpend.tv_usec-tpstart.tv_usec);
    //for(i=0; i<N1; i++)
    //{
      //printf("%d ",array1[i]);
    //}
    //printf("\n");
    
    
    return 0;
    
}

コンパイルしてg ++で実行すると、結果は次のようになります。

初めて

time:0s,21539ms
time:0s,93967ms
time:0s,16531ms
time:0s,16554ms


time:0s,6204ms


time:0s,6070ms

2回目

time:0s,21348ms
time:0s,94609ms
time:0s,16356ms
time:0s,16607ms


time:0s,6203ms


time:0s,6081ms

 

おすすめ

転載: blog.csdn.net/eidolon_foot/article/details/113353776