malloc,new,VirtualAlloc,HeapAlloc性能(速度)比较

时间:2022-02-27 13:36:15

 这里比较的VC++编译的C++代码中的性能

我用的是VC6.0测试的

就不介绍这几个的用法了

 

我写了一段简单的测试代码

测试结果是:

malloc:390
new:391
VirtualAlloc:454
HeapAlloc:47

很明显的是HeapAlloc分配速度最快,malloc次之,new和malloc差不多,VirtualAlloc最慢了(以前小强跟我说这个最快)

我有跟踪了一下

new调用了这段代码

 

  1. void * __cdecl _nh_malloc (
  2.         size_t nSize,
  3.         int nhFlag
  4.         )
  5. {
  6.         return _nh_malloc_dbg(nSize, nhFlag, _NORMAL_BLOCK, NULL, 0);
  7. }

malloc函数是这样的:

  1. _CRTIMP void * __cdecl malloc (
  2.         size_t nSize
  3.         )
  4. {
  5.         return _nh_malloc_dbg(nSize, _newmode, _NORMAL_BLOCK, NULL, 0);
  6. }

很明显,new和malloc最终调用相同的_nh_malloc_dbg,只是new多了一次函数调用

再继续跟下去,发现最终调用的是return HeapAlloc(_crtheap, 0, size);

基本上真相大白了

 

VirtualAlloc跟踪不进去,如果说分配的是虚拟内存的话,有可能会慢吧。

回头再认真看看《Windows核心编程》这本书!

欢迎指正!欢迎交流!

 

测试代码如下:

  1. /******************************************************************
  2. *
  3. * Copyright (c) 2008,  xxxx
  4. * All rights reserved.
  5. *
  6. * 文件名称:main.cpp
  7. * 摘   要: 测试申请内存的速度
  8. *
  9. * 当前版本:1.0
  10. * 作    者:吴会然
  11. * 完成日期:2008-11-30
  12. *
  13. * 取代版本:
  14. * 原  作者:
  15. * 完成日期:
  16. *
  17. ******************************************************************/
  18. #include <iostream>
  19. #include <windows.h>
  20. using namespace std;
  21. int main( int argc, char *argv[] )
  22. {
  23.     int i = 0;
  24.     DWORD dw1 = 0, dw2 = 0, dw3 = 0, dw4 = 0;
  25.     DWORD dwStart = 0;
  26.     DWORD dwEnd = 0;
  27.     forint j = 0; j < 10; j++ )
  28.     {
  29.         dwStart = ::GetTickCount();
  30.         for( i = 0; i < 20000; i++ )
  31.         {
  32.             char *pDest1 = (char *)malloc(4096);
  33.             free( pDest1 );
  34.     
  35.         }
  36.         dwEnd = ::GetTickCount();
  37.         cout << "malloc 10000次4096大小的内存块,耗时" << dwEnd - dwStart << endl;
  38.         dw1 += dwEnd - dwStart;
  39.         dwStart = ::GetTickCount();
  40.         for( i = 0; i < 20000; i++ )
  41.         {
  42.             char *pDest2 = new char[4096];
  43.             delete pDest2;
  44.     
  45.         }
  46.         dwEnd = ::GetTickCount();
  47.         cout << "new 10000次4096大小的内存块,耗时" << dwEnd - dwStart << endl;
  48.         dw2 += dwEnd - dwStart;
  49.         dwStart = ::GetTickCount();
  50.         for( i = 0; i < 20000; i++ )
  51.         {
  52.             void* pMem = ::VirtualAlloc(NULL, 4096,  MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE );
  53.             ::VirtualFree(pMem, 0, MEM_RELEASE);
  54.         }
  55.         dwEnd = ::GetTickCount();
  56.         cout << "VirtualAlloc 10000次4096大小的内存块,耗时" << dwEnd - dwStart << endl;
  57.         dw3 += dwEnd - dwStart;
  58.         HANDLE hHeap = ::HeapCreate(HEAP_NO_SERIALIZE, 0, 0);
  59.         dwStart = ::GetTickCount();
  60.         for( i = 0; i < 20000; i++ )
  61.         {
  62.             void* pMem2 = ::HeapAlloc(hHeap, HEAP_NO_SERIALIZE, 4096 );
  63.             ::HeapFree(hHeap, HEAP_NO_SERIALIZE, pMem2);
  64.         }
  65.         dwEnd = ::GetTickCount();
  66.         cout << "HeapAlloc 10000次4096大小的内存块,耗时" << dwEnd - dwStart << endl;
  67.         dw4 += dwEnd - dwStart;
  68.     }
  69.     cout << "malloc:" << dw1 << endl;
  70.     cout << "new:" << dw2 << endl;   
  71.     cout << "VirtualAlloc:" << dw3 << endl;   
  72.     cout << "HeapAlloc:" << dw4 << endl;   
  73.     return 0;
  74. }