高速缓存对c程序的影响

CSAPP中习题6.32:

void transpose(int* dst,int *src,int dim){
    int i,j;
    for(i=0;i<dim;i++){
        for(j=0;j<dim;j++)
            dst[j*dim+i]=src[i*dim+j];
            //dst[i*dim+j]=src[j*dim+i];
    }
}

习题中要求对这个函数进行优化,使其运行的尽可能快(注意:如果dst=src时 该函数将无法给出正确的转置 对于 i< j dst[ j][i]=src[i][j];之后dst[i][j]=src[j][i]=src[i][j] 所以严格来说程序并不正确)

这里函数对src(读)有良好的空间局部性,而注释对dst(写)有良好的空间局部性
那么dst 跟src 究竟该如何抉择呢?

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 2048
clock_t transpose1(int *dst,int *src,int dim)
{
    clock_t t;
    t=clock();
    int i,j;
    for(i=0;i<dim;++i){
        for(j=0;j<dim;++j){
            dst[j*dim+i]=src[i*dim+j];
        }
    }
    return clock()-t;
}
clock_t transpose2(int *dst,int *src,int dim)
{
    clock_t t;
    t=clock();
    int i,j;
    for(i=0;i<dim;++i){
        for(j=0;j<dim;++j){
            dst[i*dim+j]=src[j*dim+i];
        }
    }
    return clock()-t;
}
int main(int argc,char *argv[])
{

    int i;
    double s,sum;
    int *a=(int *)malloc(sizeof(int)*N*N);
    if(a==NULL){
        printf("malloc error!\n");
        exit(-1);

    }
    for(i=0,sum=0;i<40;++i){
        s=(double )transpose1(a,a,N)/CLOCKS_PER_SEC;
        sum+=s;
        printf("%f ",s);
    }
    printf("\naver:%f s\n",sum/i);
    for(i=0,sum=0;i<40;++i){
        s=(double )transpose2(a,a,N)/CLOCKS_PER_SEC;
        sum+=s;
        printf("%f ",s);
    }
    printf("\naver:%f s\n",sum/i);
}

asus-x450v ubuntu-15.04 下结果如下:

racg@racg-X450VC:~/github/CSAPP/chap2$ gcc -O2 -g test632.c -o test632
racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 
0.088328 0.075335 0.073660 0.073343 0.073186 0.072931 0.073345 0.073347 0.074611 0.073000 0.072897 0.073458 0.075522 0.075008 0.073786 0.072985 0.075262 0.075496 0.073429 0.072996 0.073051 0.073508 0.073138 0.073082 0.074234 0.073698 0.074394 0.073021 0.073352 0.073151 0.073128 0.073185 0.074191 0.073191 0.072762 0.073210 0.073014 0.072896 0.073125 0.072591 
aver:0.073946 s
0.049332 0.047900 0.046897 0.047084 0.046906 0.047104 0.047036 0.046972 0.046993 0.046783 0.046938 0.046898 0.046930 0.047189 0.047473 0.047003 0.046958 0.046712 0.046854 0.047030 0.046735 0.047645 0.047265 0.046955 0.047009 0.047043 0.047726 0.046963 0.046967 0.046807 0.046846 0.046896 0.046896 0.046859 0.047024 0.046946 0.047065 0.046977 0.046886 0.047514 
aver:0.047100 s
racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 
0.084686 0.076081 0.075047 0.074284 0.073946 0.074174 0.074238 0.076167 0.074529 0.074541 0.074332 0.074224 0.074126 0.074360 0.074123 0.074419 0.075260 0.074071 0.074187 0.074304 0.075282 0.074347 0.074233 0.074390 0.075235 0.074127 0.074435 0.074133 0.074109 0.074204 0.074046 0.074090 0.075034 0.075260 0.074775 0.074160 0.074719 0.074155 0.074127 0.074014 
aver:0.074749 s
0.050311 0.047773 0.048264 0.047943 0.047927 0.047646 0.047647 0.047723 0.047994 0.048185 0.048238 0.048592 0.047814 0.048007 0.047583 0.047755 0.047714 0.047627 0.047711 0.047575 0.047744 0.047751 0.047677 0.047710 0.047637 0.048277 0.047633 0.047530 0.047603 0.047713 0.047731 0.047675 0.048529 0.047599 0.047695 0.047654 0.047894 0.047875 0.048047 0.047687 
aver:0.047892 s
racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 
0.082047 0.073840 0.072420 0.071705 0.071752 0.071794 0.071699 0.071718 0.073112 0.073322 0.072200 0.072203 0.071850 0.071716 0.071814 0.071924 0.072867 0.071798 0.071790 0.071810 0.071607 0.071649 0.071929 0.073472 0.073022 0.072104 0.071859 0.071631 0.071654 0.071951 0.072790 0.075006 0.073715 0.073955 0.072266 0.071710 0.073423 0.072129 0.072035 0.071950 
aver:0.072581 s
0.049054 0.046517 0.047292 0.046432 0.046773 0.046447 0.046462 0.046626 0.046376 0.046437 0.046548 0.046430 0.046498 0.046488 0.046497 0.047664 0.047689 0.046329 0.046878 0.046456 0.046634 0.046550 0.046425 0.046385 0.046579 0.046496 0.046582 0.047478 0.046812 0.046804 0.046515 0.046495 0.046446 0.046419 0.046643 0.046944 0.046495 0.047526 0.046815 0.046748 
aver:0.046742 s
racg@racg-X450VC:~/github/CSAPP/chap2$ gcc -g test632.c -o test632
racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 
0.122130 0.085775 0.080064 0.079610 0.081753 0.080143 0.080409 0.080180 0.080013 0.079075 0.079429 0.079397 0.079768 0.079550 0.081045 0.079677 0.079382 0.082167 0.080054 0.079457 0.079770 0.080644 0.080005 0.079555 0.079195 0.079632 0.079787 0.079580 0.079617 0.082464 0.079843 0.079464 0.079540 0.079318 0.078787 0.079691 0.080524 0.080312 0.079748 0.079406 
aver:0.081149 s
0.066526 0.064227 0.066351 0.064425 0.063982 0.065758 0.064626 0.064171 0.064065 0.064223 0.064018 0.064469 0.064082 0.064184 0.065250 0.064371 0.064498 0.064185 0.066242 0.064440 0.064189 0.064346 0.064304 0.064076 0.065550 0.064569 0.064197 0.064044 0.064074 0.064283 0.064150 0.064099 0.064069 0.066287 0.064383 0.064390 0.064025 0.064515 0.064124 0.064165 
aver:0.064548 s
racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 
0.120574 0.086958 0.080388 0.079176 0.079785 0.079070 0.080510 0.080163 0.079730 0.078555 0.079258 0.079752 0.079117 0.079233 0.082527 0.079547 0.079418 0.080343 0.079406 0.079329 0.079273 0.079682 0.081512 0.079872 0.079763 0.079258 0.081703 0.079283 0.079184 0.080931 0.079930 0.079299 0.079689 0.079735 0.079395 0.079055 0.079363 0.081646 0.079598 0.081784 
aver:0.081070 s
0.066352 0.064712 0.064443 0.064541 0.064353 0.065876 0.064595 0.064547 0.064274 0.064248 0.064334 0.064348 0.064512 0.064587 0.066906 0.064796 0.064625 0.064405 0.064660 0.064412 0.064296 0.064545 0.064248 0.064476 0.065931 0.064548 0.064279 0.064523 0.064120 0.066050 0.064737 0.064529 0.064500 0.065931 0.064861 0.064320 0.064276 0.064485 0.064596 0.072743 
aver:0.064938 s
racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 
0.122052 0.085333 0.081154 0.078984 0.079097 0.079069 0.079228 0.079709 0.079206 0.079090 0.079385 0.078957 0.079293 0.079001 0.081142 0.081622 0.081766 0.081070 0.082323 0.080718 0.080691 0.079533 0.082441 0.079065 0.078835 0.079196 0.078658 0.081808 0.079852 0.079209 0.079229 0.082747 0.080583 0.079319 0.079200 0.079500 0.083713 0.079674 0.079310 0.081437 
aver:0.081305 s
0.067318 0.064429 0.063979 0.063841 0.066023 0.065258 0.063543 0.063999 0.064761 0.065045 0.063799 0.063685 0.063846 0.063971 0.065120 0.065325 0.063770 0.063889 0.063745 0.063748 0.063683 0.063611 0.063643 0.063773 0.063759 0.063804 0.063719 0.065702 0.065945 0.063706 0.064501 0.064801 0.065215 0.064310 0.063874 0.063728 0.067117 0.064128 0.063954 0.063537 
aver:0.064390 s

由数据有:
1.方法2较方法1有更高的效率(windows下验证似乎不一样)

另外可以看出在运行过程中两种方法在前期都随着循环次数的增加效率有相应略有提高方法一较为明显,向来原因应该是随着循环次数增加缓存加热


稍加修改

clock_t transpose1(int *dst,int *src,int dim)
{
    clock_t t;
    t=clock();
    int i,j,ind=0;
    for(i=0;i<dim;++i){
        for(j=0;j<dim;j++,ind++){
            dst[j*dim+i]=src[ind];
        }
    }
    return clock()-t;
}
clock_t transpose2(int *dst,int *src,int dim)
{
    clock_t t;
    t=clock();
    int i,j,ind=0;
    for(i=0;i<dim;++i){
        for(j=0;j<dim;j++,ind++){
            dst[ind]=src[j*dim+i];
        }
    }
    return clock()-t;
}

运行结果如下:

racg@racg-X450VC:~/github/CSAPP/chap2$ gcc -O2 -g test632.c -o test632
racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 
0.084458 0.075859 0.074590 0.072886 0.072274 0.072222 0.072555 0.073080 0.074069 0.073654 0.072600 0.072344 0.072298 0.072224 0.073314 0.072481 0.073612 0.072769 0.072215 0.072412 0.072598 0.072943 0.071944 0.074446 0.074197 0.072660 0.071958 0.072494 0.073029 0.072012 0.072273 0.072656 0.072866 0.073366 0.072502 0.072940 0.072097 0.074132 0.072559 0.072618 
aver:0.073205 s
0.048772 0.047302 0.047230 0.046929 0.046964 0.046979 0.047092 0.047104 0.047271 0.046971 0.056692 0.051896 0.049736 0.048199 0.047937 0.046960 0.047637 0.047354 0.046993 0.046952 0.047132 0.047019 0.046908 0.047226 0.046869 0.046991 0.047643 0.046949 0.047217 0.046840 0.046965 0.047027 0.046847 0.047020 0.046989 0.046852 0.047136 0.047634 0.047324 0.047520 
aver:0.047627 s
racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 
0.084992 0.076507 0.074758 0.074010 0.073281 0.073785 0.073780 0.074170 0.074103 0.073692 0.073397 0.073403 0.073768 0.073308 0.073912 0.074869 0.075446 0.073672 0.073505 0.074010 0.073993 0.073380 0.073659 0.073600 0.074605 0.073816 0.073644 0.073798 0.074404 0.073839 0.073768 0.074083 0.074847 0.073810 0.073622 0.073698 0.074074 0.073294 0.073356 0.073794 
aver:0.074236 s
0.050402 0.047505 0.046684 0.048188 0.046826 0.046937 0.046893 0.046985 0.046747 0.047056 0.047123 0.047017 0.046983 0.047612 0.046699 0.047031 0.046815 0.047046 0.047093 0.046888 0.046893 0.046904 0.046932 0.046897 0.046855 0.048757 0.047388 0.046670 0.047011 0.046884 0.047040 0.046999 0.046993 0.046836 0.046801 0.046968 0.046939 0.046940 0.046789 0.047624 
aver:0.047141 s
racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 
0.084189 0.075493 0.074127 0.073255 0.073321 0.073593 0.073394 0.073426 0.074503 0.074099 0.073860 0.073401 0.073464 0.073300 0.073193 0.073463 0.074668 0.073453 0.073147 0.073713 0.073453 0.073303 0.073321 0.075217 0.074663 0.073041 0.073480 0.073736 0.073672 0.073454 0.073374 0.073242 0.074612 0.073217 0.073261 0.073230 0.073338 0.075376 0.073375 0.073374 
aver:0.073970 s
0.049225 0.048562 0.047818 0.047795 0.047756 0.047704 0.047725 0.047676 0.047797 0.047630 0.047793 0.047866 0.047955 0.048452 0.047615 0.047759 0.048482 0.047703 0.047669 0.047894 0.047699 0.047597 0.048389 0.047699 0.049340 0.047589 0.048373 0.047722 0.047690 0.047733 0.047761 0.047964 0.047593 0.047820 0.047646 0.047687 0.047577 0.048760 0.048463 0.047649 
aver:0.047941 s
racg@racg-X450VC:~/github/CSAPP/chap2$ gcc -g test632.c -o test632
racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 
0.122716 0.086362 0.082700 0.080401 0.080727 0.081098 0.081830 0.080317 0.080449 0.080064 0.080239 0.080359 0.080420 0.079966 0.085387 0.094534 0.082094 0.080165 0.080270 0.080074 0.080150 0.081805 0.080163 0.079872 0.080156 0.079962 0.079943 0.081869 0.080046 0.080753 0.080143 0.080261 0.080021 0.080187 0.080106 0.079921 0.082196 0.080038 0.079927 0.082148 
aver:0.082246 s
0.066301 0.063151 0.062934 0.063150 0.064173 0.063381 0.063141 0.063207 0.063248 0.062927 0.063162 0.063043 0.063133 0.062887 0.064249 0.065513 0.063405 0.063180 0.062891 0.063312 0.063376 0.062926 0.062985 0.064083 0.063272 0.063050 0.062981 0.063155 0.063215 0.063016 0.062984 0.065242 0.063195 0.064563 0.063039 0.063325 0.063345 0.062916 0.063077 0.063300 
aver:0.063436 s
racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 
0.121766 0.086219 0.081244 0.080589 0.080695 0.082554 0.082421 0.080667 0.080788 0.080655 0.080920 0.081549 0.080667 0.080635 0.082151 0.080919 0.080578 0.082405 0.080733 0.080761 0.080572 0.082288 0.081716 0.081723 0.080914 0.080728 0.081216 0.080548 0.080664 0.083382 0.081254 0.080850 0.080655 0.080770 0.081024 0.080329 0.081973 0.080894 0.080530 0.080600 
aver:0.082289 s
0.064781 0.062581 0.063687 0.062970 0.063897 0.062843 0.062615 0.063088 0.062528 0.062491 0.062472 0.062594 0.062364 0.062480 0.063648 0.062838 0.062317 0.062464 0.064040 0.062967 0.062779 0.062335 0.062394 0.062993 0.063761 0.062774 0.062622 0.062505 0.062445 0.062322 0.062315 0.062619 0.062388 0.068484 0.063168 0.062984 0.063127 0.062280 0.063158 0.063005 
aver:0.063003 s
racg@racg-X450VC:~/github/CSAPP/chap2$ ./test632 
0.120738 0.084820 0.078652 0.078008 0.077840 0.078297 0.078046 0.080617 0.078352 0.078110 0.078125 0.078487 0.078211 0.077910 0.079978 0.077921 0.078019 0.078059 0.078081 0.078066 0.079595 0.078495 0.107833 0.090293 0.079568 0.078143 0.078213 0.078590 0.078465 0.080077 0.079048 0.078129 0.080188 0.078737 0.078187 0.078668 0.078489 0.079858 0.078282 0.118088 
aver:0.081832 s
0.068486 0.062927 0.062152 0.062148 0.062176 0.064607 0.062751 0.062466 0.062035 0.062176 0.062074 0.062454 0.062078 0.062051 0.063207 0.062713 0.062123 0.062230 0.061972 0.062334 0.062180 0.061981 0.064263 0.062685 0.063387 0.062356 0.062260 0.062422 0.062106 0.061973 0.062297 0.062388 0.062045 0.062234 0.063351 0.062524 0.062171 0.061992 0.064258 0.062602 
aver:0.062666 s

可以看见在修改了小地方后 在不开启O2优化时运行时间减少了约0.02秒
O2优化下相差不明显

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值