打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
memset效率测试

    刚刚AC了一题,需要将数组部分初始化为零,为了简单我就用memset将整个数组置零了,在我印象中memset函数的速度是快得惊人的,没想到居然超时了,让我不得不重新审视memset的效率和我那想当然的愚昧。

    初始化部分如下:

  1. #include<stdio.h>  
  2. #define MAX 1000  
  3. int ndata[ MAX ][ MAX ];  
  4.   
  5. int main()  
  6.   
  7. {  
  8.     char a[MAX];  
  9.     char b[MAX];  
  10.   
  11.     int i , j;  
  12.     int nTemp = 10000;  
  13.     i = nTemp, j = nTemp;     
  14.     double BegTime , EndTime;  
  15.         BegTime = clock();  
  16.         while( i-- )   
  17.         {  
  18.             memset( ndata, 0, sizeof(int) * MAX * MAX );  
  19.         }  
  20.         EndTime = clock();  
  21.         printf(" %g s \n ", (EndTime - BegTime ) / 1000/1000);  
  22.   
  23.   
  24.         BegTime = clock();  
  25.   
  26.         while( nTemp-- )   
  27.         {  
  28.         for ( i = 0; i <= MAX; i++)  
  29.             ndata[i][0] = 0;  
  30.         for ( j = 0; j <= MAX; j++)  
  31.             ndata[0][j] = 0;  
  32.         }  
  33.   
  34.         EndTime = clock();  
  35.         printf(" %g s \n ", (EndTime - BegTime ) / 1000/1000);  
  36. return 0;  
  37. }  

3.75s

0.11s

    速度相差了三十倍,难怪会超时,为了知道memset的效率,又试了下如下案例


  1. #include<stdio.h>  
  2. #define MAX 1000  
  3. int ndata[ MAX ][ MAX ];  
  4.   
  5. int main()  
  6.   
  7. {  
  8.     char a[MAX];  
  9.     char b[MAX];  
  10.   
  11.     int i , j;  
  12.     int nTemp = 10000;  
  13.     i = nTemp, j = nTemp;     
  14.     double BegTime , EndTime;  
  15.         BegTime = clock();  
  16.         while( i-- )   
  17.         {  
  18.             memset( ndata, 0, sizeof(int) * MAX * MAX );  
  19.         }  
  20.         EndTime = clock();  
  21.         printf(" %g s \n ", (EndTime - BegTime ) / 1000/1000);  
  22.   
  23.   
  24.         BegTime = clock();  
  25.   
  26.         while( nTemp-- )   
  27.         {  
  28. /*      for ( i = 0; i <= MAX; i++) 
  29.             ndata[i][0] = 0; 
  30.         for ( j = 0; j <= MAX; j++) 
  31.             ndata[0][j] = 0; 
  32. */  
  33.         for ( i = 0; i < MAX; i++)  
  34.         for ( j = 0; j < MAX; j++)  
  35.             ndata[i][j] = 0;  
  36.         }  
  37.   
  38.         EndTime = clock();  
  39.         printf(" %g s \n ", (EndTime - BegTime ) / 1000/1000);  
  40. return 0;  
  41. }  

上述代码就为了初始化一个大数组,执行结果如下:

3.58s

24.8s


测试结果表明:memset比普通的初始化快7倍,所以应该多用memset来完成初始化工作。但,最根本还是应该减少计算机的计算量。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
C语言的数组学习入门之对数组初始化的操作
第六讲 getchar()
IO多路复用
从零开始学算法:高精度计算
C语言 扫雷游戏代码及详细注释
C语言指针入门(解决你的各种概念问题的总结,包括空指针、野指针、数组指针、指针数组、函数指针、指针函...
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服