青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

流量統計:
Rixu Blog (日需博客)
日需博客,每日必需來踩踩哦..
posts - 108,comments - 54,trackbacks - 0

這里比較的VC++編譯的C++代碼中的性能

我用的是VC6.0測試的

就不介紹這幾個的用法了

我寫了一段簡單的測試代碼

測試結果是:

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

很明顯的是HeapAlloc分配速度最快,malloc次之,newmalloc差不多,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. }
  7.  

很明顯,newmalloc最終調用相同的_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.  
  19. #include <iostream>
  20. #include <windows.h>
  21. using namespace std;
  22.  
  23. int main( int argc, char *argv[] )
  24. {
  25.     int i = 0;
  26.     DWORD dw1 = 0, dw2 = 0, dw3 = 0, dw4 = 0;
  27.     DWORD dwStart = 0;
  28.     DWORD dwEnd = 0;
  29.     forint j = 0; j < 10; j++ )
  30.      {
  31.          dwStart = ::GetTickCount();
  32.         for( i = 0; i < 20000; i++ )
  33.          {
  34.             char *pDest1 = (char *)malloc(4096);
  35.              free( pDest1 );
  36.     
  37.          }
  38.          dwEnd = ::GetTickCount();
  39.          cout << "malloc 100004096大小的內存塊,耗時" << dwEnd - dwStart << endl;
  40.          dw1 += dwEnd - dwStart;
  41.  
  42.          dwStart = ::GetTickCount();
  43.         for( i = 0; i < 20000; i++ )
  44.          {
  45.             char *pDest2 = new char[4096];
  46.             delete pDest2;
  47.     
  48.          }
  49.          dwEnd = ::GetTickCount();
  50.          cout << "new 100004096大小的內存塊,耗時" << dwEnd - dwStart << endl;
  51.          dw2 += dwEnd - dwStart;
  52.  
  53.          dwStart = ::GetTickCount();
  54.         for( i = 0; i < 20000; i++ )
  55.          {
  56.             void* pMem = ::VirtualAlloc(NULL, 4096,   MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE );
  57.              ::VirtualFree(pMem, 0, MEM_RELEASE);
  58.          }
  59.          dwEnd = ::GetTickCount();
  60.          cout << "VirtualAlloc 100004096大小的內存塊,耗時" << dwEnd - dwStart << endl;
  61.          dw3 += dwEnd - dwStart;
  62.  
  63.         HANDLE hHeap = ::HeapCreate(HEAP_NO_SERIALIZE, 0, 0);
  64.          dwStart = ::GetTickCount();
  65.         for( i = 0; i < 20000; i++ )
  66.          {
  67.             void* pMem2 = ::HeapAlloc(hHeap, HEAP_NO_SERIALIZE, 4096 );
  68.              ::HeapFree(hHeap, HEAP_NO_SERIALIZE, pMem2);
  69.  
  70.          }
  71.          dwEnd = ::GetTickCount();
  72.          cout << "HeapAlloc 100004096大小的內存塊,耗時" << dwEnd - dwStart << endl;
  73.          dw4 += dwEnd - dwStart;
  74.  
  75.      }
  76.  
  77.      cout << "malloc:" << dw1 << endl;
  78.      cout << "new:" << dw2 << endl;   
  79.      cout << "VirtualAlloc:" << dw3 << endl;   
  80.      cout << "HeapAlloc:" << dw4

 

 

 

====================================

1 把分配的內存空間改為4M甚至更高(循環次數減少)試試,結果截然不同。處理M級的大文件時,用VirtualAlloc效率高

2 博主的測試需要考究,系統在創建線程時就已經預先在線程的堆棧段中提交了兩個頁面。 按照我的觀點new和malloc只要消耗的內存沒有超過頁面大小就不會實際的進行存儲器的保留與提交。二者的操作不在一個層面上。

3 在分配大于一個頁面數據的時候 virtualAlloc才有意義

4 virtualAlloc是操作系統提供的最根本的內存分配接口。HeapAlloc預先使用virtualAlloc申請了大塊的內存,并根據優化算法組織了用于內存管理的數據結構,主要是對小內存分配的優化 new和malloc是語言層面接口,由于HeapAlloc已經有了優化,所以vc中的malloc并沒有使用更多的優化算法,直接轉入 HeapAlloc。

Logo
作者:Gezidan
出處:http://www.rixu.net    
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
posted on 2011-08-15 09:19 日需博客 閱讀(1402) 評論(2)  編輯 收藏 引用 所屬分類: C C++Windows技術文章轉載

FeedBack:
# re: malloc,new,VirtualAlloc,HeapAlloc性能(速度)比較[未登錄]
2011-08-23 13:43 | Chipset
這種測試根本測不出真實速度。主要原因是剛分配一塊內存就放掉,再分配還是剛才釋放的那塊內存,具體應用中則不是這樣的,再者不應該始終分配一樣的塊大小。

應該這樣測試:分配塊大小隨機,把返回的指針存入一個數組,然后釋放也隨機進行。這樣才能看出它們的"真實"速度。常采用的做法是使用腳本測試程序,因為腳本狂吃內存,使用不同的內存管理函數或API比較一下腳本的執行速度。

其實只衡量速度是不科學的,還應該看下碎片率,峰值內存,頁面錯誤,還有CPU緩存丟失率等指標。  回復  更多評論
  
# re: malloc,new,VirtualAlloc,HeapAlloc性能(速度)比較
2011-11-18 11:00 | 星綻紫輝
@Chipset
When you allocate memory with new, the memory is allocated in the virtual memory or the physical memory. Where the memory is allocated is unknown, the memory can be allocated between two pages. This means that we load too much memory into the physical memory when we access a certain data (if we use new). Furthermore, you do not know if the allocated memory is in physical memory or in virtual, and also you can not tell the system when "writing back" to hard disk is unnecessary (if we don’t care of the data in memory anymore). But be aware!! Any new allocation using VirtualAlloc* will always be rounded up to 64 KB (page file size) boundary so that if you allocate a new VAS region bound to the physical memory, the OS will consume an amount of physical memory rounded up to the page size, and will consume the VAS of the process rounded up to 64 KB boundary. Using VirtualAlloc can be difficult: new and malloc use virualAlloc internally, but every time you allocate memory with new/delete, a lot of other computation is done, and you do not have the control to put your data (data related to each other) nicely inside the same page (without overlapping two pages). However, heaps are best for managing large numbers of small objects, and I shall change the source code so it only uses new/delete because of code cleanness. I have found that the performance gain is too small relative when compared to the complexity of the source code.  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品网站在线播放gif| 夜夜嗨av色综合久久久综合网 | 亚洲精品久久久久中文字幕欢迎你 | 亚洲高清久久网| 国产一区二区三区不卡在线观看 | 中日韩男男gay无套| 亚洲国产高清一区| 久久精品成人欧美大片古装| 亚洲综合精品| 欧美三级欧美一级| 亚洲精品一二区| 日韩视频―中文字幕| 久久人人精品| 蜜月aⅴ免费一区二区三区 | 国产女同一区二区| 亚洲性视频网站| 亚洲女爱视频在线| 欧美午夜影院| 亚洲一区二区免费视频| 亚洲欧美国产日韩天堂区| 欧美性视频网站| 一本色道久久精品| 亚洲欧美日韩一区二区| 国产精品a级| 亚洲综合色在线| 久久国产视频网站| 狠狠入ady亚洲精品| 久久久久久久999| 欧美成人在线免费观看| 亚洲国产精品一区二区第四页av| 久热精品视频在线观看| 亚洲国产精品激情在线观看| 亚洲欧洲另类国产综合| 欧美精品成人在线| 一区二区三区久久久| 午夜亚洲激情| 国内精品久久久久久久果冻传媒| 久久精品国产成人| 欧美黑人在线观看| 这里只有视频精品| 国产精品一区一区三区| 久久精品在线| 亚洲日本欧美在线| 欧美伊人久久久久久久久影院| 国产亚洲激情在线| 玖玖在线精品| 中日韩美女免费视频网站在线观看| 欧美一区二区成人6969| 在线成人性视频| 欧美日韩亚洲系列| 久久精品99国产精品日本| 亚洲第一区在线观看| 亚洲欧美精品在线| 一色屋精品视频免费看| 欧美日韩国产在线播放| 欧美在线视屏| 亚洲美女视频在线观看| 久久久久久久久蜜桃| 亚洲久久视频| 国产欧美综合一区二区三区| 美女精品国产| 亚洲欧美日韩久久精品| 亚洲国产精品成人| 欧美在线亚洲| 99re66热这里只有精品3直播| 国产视频精品网| 欧美激情bt| 久久国产一区二区| 亚洲图片欧美日产| 亚洲福利在线观看| 久久久久久久尹人综合网亚洲 | 美乳少妇欧美精品| 欧美一区二区三区日韩视频| 亚洲人体大胆视频| 揄拍成人国产精品视频| 国产精品欧美精品| 欧美成人精品h版在线观看| 午夜精品视频在线| 一区二区欧美在线观看| 欧美激情视频一区二区三区免费| 欧美一区二视频| 一区二区三区日韩在线观看| 伊人久久噜噜噜躁狠狠躁| 国产精品手机在线| 欧美视频在线观看免费| 欧美黄色免费网站| 欧美阿v一级看视频| 久久久91精品| 久久精品国产999大香线蕉| 亚洲自拍高清| 亚洲视频专区在线| 亚洲精品日本| 亚洲精品乱码久久久久久| 欧美大胆成人| 欧美高清视频一区二区三区在线观看 | 免费日韩视频| 蜜桃久久精品一区二区| 久久综合色播五月| 久久免费视频在线观看| 久久国产精品久久国产精品| 亚洲欧美日韩在线一区| 亚洲一级电影| 亚洲欧美影音先锋| 欧美一区二区在线免费播放| 欧美亚洲免费| 久久久久久精| 久久香蕉国产线看观看av| 久久久久9999亚洲精品| 久久欧美肥婆一二区| 久久久午夜精品| 美女免费视频一区| 欧美高清视频一区| 亚洲欧洲一区二区三区在线观看| 亚洲国产成人久久综合| 亚洲日本激情| 亚洲无亚洲人成网站77777| 中日韩午夜理伦电影免费| 亚洲专区一二三| 欧美在线观看视频一区二区| 久久久人成影片一区二区三区| 久久夜色精品| 欧美精品日韩一区| 国产精品免费一区二区三区观看| 国产精品亚洲综合久久| 激情综合中文娱乐网| 亚洲黄色在线观看| 亚洲图片在区色| 久久久久久久久久久久久9999| 久久久久久久久久久成人| 欧美高清hd18日本| 亚洲视频日本| 久久蜜臀精品av| 欧美日韩不卡视频| 国产欧美激情| 亚洲理伦电影| 久久av一区| 亚洲人成77777在线观看网| 一本色道88久久加勒比精品| 午夜精品福利电影| 欧美大片国产精品| 国产精品视频内| 亚洲经典在线| 久久成人国产精品| 亚洲精品美女在线| 性久久久久久久久| 欧美日韩成人一区| 国产欧美综合一区二区三区| 亚洲日本成人在线观看| 欧美在线关看| 亚洲精品中文字幕在线观看| 午夜激情综合网| 欧美精品日本| 激情亚洲一区二区三区四区| 一本色道久久综合亚洲精品不卡| 久久精品国产久精国产思思| 亚洲激情另类| 久久午夜激情| 国产日韩欧美亚洲一区| 宅男噜噜噜66一区二区| 免费不卡在线视频| 西西裸体人体做爰大胆久久久| 欧美国产日韩视频| 在线欧美亚洲| 久久久久在线观看| 亚洲自拍偷拍色片视频| 欧美日本高清| 亚洲欧洲一区二区在线播放| 久久久亚洲精品一区二区三区| 一本到12不卡视频在线dvd| 欧美粗暴jizz性欧美20| 亚洲高清精品中出| 久久亚洲影音av资源网| 性久久久久久久久久久久| 国产精品劲爆视频| 正在播放日韩| 亚洲毛片视频| 欧美人妖在线观看| 亚洲日本在线观看| 欧美国产日韩一区二区| 久久精品欧洲| 一区二区三区自拍| 久久在线视频在线| 久久精品国产久精国产一老狼 | 国产精品色婷婷| 亚洲一区二区在线看| 夜夜嗨av一区二区三区四季av | 玖玖精品视频| 一区免费在线| 久色成人在线| 久久综合中文字幕| 亚洲激情网址| 亚洲精品美女在线观看| 欧美精品一区二区三区在线看午夜 | 亚洲宅男天堂在线观看无病毒| 亚洲精品免费在线播放| 欧美日韩精品三区| 午夜免费久久久久| 亚洲欧美日韩另类精品一区二区三区| 国产精品日本精品| 久久久精品999|