闂傚倸鍊峰ù鍥Υ閳ь剟鏌涚€n偅宕岄柡宀€鍠栭、娑樷堪閸愮偓姣夋俊鐐€戦崕濠氬箯閿燂拷 (0) +1 闂傚倷娴囧畷鍨叏瀹ュ拋鍚嬮柛鈩冾殢娴硷拷 (0) +1 闂傚倸鍊搁崐鎼併偑鐎涙ḿ顩查柣鎴f缁狀垶鏌ㄩ悤鍌涘 (0) +1
闂傚倸鍊峰ù鍥Υ閳ь剟鏌涚€n偅宕岄柡宀€鍠栭、娑樷堪閸愮偓姣夋俊鐐€戦崕鏌ュ垂閸ф钃熼柣鏃囥€€閸嬫挸鈽夊▍顓т簼閹便劑宕惰閺€鑺ャ亜閺囩偞顥為悗姘炬嫹闂傚倸鍊风粈渚€骞栭銈嗗仏妞ゆ劧绠戠壕鍧楁煕閹邦垼鍤嬮柤鏉挎健閺屾稑鈽夊▎鎰▏缂傚倷璁查弲鐘诲蓟閻旂⒈鏁嶆繝濠傚枤閺嗩厼顪冮妶鍐ㄥ姷闁瑰嚖鎷�>>

正在阅读:精彩教程:快速初始化内存(1)精彩教程:快速初始化内存(1)

2004-05-20 10:13 出处:CSDN 作者:jerrylhw 责任编辑:linjixiong
  许多计算密集型的应用都需要处理大量内存,这种应用中的内存初始化是一个常规操作,而内存和CPU内部的数据交换之间的速度瓶颈决定了内存初始化将会占用可观的时间。但因为应用程序初始化内存往往调用CRT的memset或者Windows API的ZeroMemory,很少有人在初始化方面进行优化。      另一方面,现在的应用硬件一般配置都比较好,大部分应用都运行在PII之上,但我们在使用诸如VC之类的编译环境时往往选择速度优化,并选择合适的处理器,然后寄希望于编译器给我们生成优化的结果,结果往往发现并不如意。      在我们的一个图像处理项目中,需要大量内存操作,而且多个线程同时运行,内存存取成为了各个模块的竞争资源,所以对内存存取优化成为项目的关键。在努力减少内存操作遍数的基础上,加快内存初始化成为我们的改进重点。      在用VC各种手段都没有太多改进后,我们把目光转向处理器特征。从Pentium系列开始,一方面Intel在不断提高CPU主频,同时也在针对多媒体等应用相继推出MMX/SSE/SSE2,增加了许多多位快速处理指令。在高层语言方面,Intel的C++ Compiler提供了针对不同处理器的最优化结果。但在一个成熟项目中贸然使用另外一种编译环境的风险较大,所以我们从Intel环境中抽取了memset的实现,重新组织了一个Lib,并在我们的项目中针对内存初始化进行了改动,并链接到抽取的lib库中。在内存初始化方面有了一个较大的提高。      下面我们用测试例子说明该过程。      一个例子      在测试程序中,分别调用微软C库的memset和intel版本的memset分别对100M内存进行60遍初始化,,为了模拟多线程环境,启动了两个线程同时进行内存初始化。测试时使用了Release版,为了方面查看包含了调试信息(调试信息无影响)。测试结果:        MSC 版本:12.453~12.547秒      Intel C版本:4.375~4.531秒      可见在大量内存操作时差别比较大。对内存存取密集型项目,因为内存存取往往是瓶颈,应该还可以提高整体处理性能。      下面是例子的代码:      // 本程序示例了使用微软CRT的memset和Intel优化的memset初始化内存的速度差异      // Lihw.      #include      #include      #include      extern "C"      void * __cdecl __intel_new_memset(void *, int, size_t);        #pragma comment(lib,"intelmem.lib")      #define SIZE 1024*1024*100      void threadfunc(void *dummy)      {       LPBYTE lpByte = (LPBYTE)dummy;//new BYTE[SIZE];       int j;      #define LoopTimes 60       DWORD dwStart, dwTime1,dwTime2;       //       //intel version         dwStart = GetTickCount();   希望看到更多更经典的开发技巧,请随时刷新《开发特区》栏目。
察看评论详细内容 我要发表评论
作者笔名 简短内容 发表时间
:
     for (j=0; j< LoopTimes; j++)       {       __intel_new_memset(lpByte,1,SIZE);       }       dwTime1 = GetTickCount() - dwStart;       //MS crt version       dwStart = GetTickCount();       for (j=0; j< LoopTimes; j++)       {       memset(lpByte,1,SIZE);       //ZeroMemory(lpByte,SIZE);       }       dwTime2 = GetTickCount() - dwStart;       //delete []lpByte;       printf("Intel=%dms MSC=%dms\n",dwTime1,dwTime2);   }      int main(int argc, char* argv[])      {      #define THREADS 2       HANDLE hThread[THREADS]; //array to hold thread handle       LPBYTE lpByte[THREADS]; //Array to hold thread-specific memory       int i;       //Count mem alloc time. Debug version is very long       DWORD dwStart = GetTickCount();       for (i=0; i希望看到更多更经典的开发技巧,请随时刷新《开发特区》栏目。
察看评论详细内容 我要发表评论
作者笔名 简短内容 发表时间
:

关注我们

最新资讯离线随时看 聊天吐槽赢奖品
闂傚倸鍊风粈浣虹礊婵犲倴缂氱憸鏃堛€侀弽顓炲耿婵$偟绮弫鐘绘⒑闁偛鑻晶鎾煙椤旀娼愰柟宄版嚇瀹曘劍绻濋崒娆愭▕濠电姷顣藉Σ鍛村磻閹捐绠柨鐕傛嫹闂傚倸鍊烽悞锕傚箖閸洖纾块柟鎯版绾剧粯绻涢幋娆忕仼闁哄嫨鍎甸幃姗€鎮欓弶鍨彑婵炲瓨绮嶇划鎾诲蓟濞戙埄鏁冮柨婵嗘椤︺儵姊洪崨濠冾棖闁瑰嚖鎷�