日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

高速缓存对c程序的影响

發布時間:2024/1/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高速缓存对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優化下相差不明顯

總結

以上是生活随笔為你收集整理的高速缓存对c程序的影响的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。