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

流量統計:
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>
            亚洲黄一区二区三区| 蜜桃视频一区| 一本色道久久综合亚洲精品不卡| 久久久久亚洲综合| 亚洲成人资源网| 亚洲成在线观看| 欧美激情精品久久久久久| 亚洲精品久久久久久下一站| 牛牛精品成人免费视频| 欧美成人中文字幕在线| 在线视频你懂得一区| 亚洲影院色在线观看免费| 国产综合在线看| 欧美+亚洲+精品+三区| 欧美激情亚洲一区| 午夜精品www| 久久婷婷国产麻豆91天堂| 日韩视频中文字幕| 亚洲欧美日韩一区二区在线| 极品少妇一区二区| 日韩午夜高潮| 国产一区二区三区av电影| 欧美激情精品久久久久久大尺度 | 欧美自拍偷拍| 亚洲国产裸拍裸体视频在线观看乱了中文| 亚洲国产岛国毛片在线| 欧美午夜性色大片在线观看| 久久久久久国产精品mv| 欧美国产日本高清在线| 欧美在线日韩| 欧美激情精品久久久久| 欧美在线短视频| 欧美激情在线狂野欧美精品| 欧美在线影院| 欧美日韩国产精品自在自线| 久久久综合香蕉尹人综合网| 欧美理论在线| 欧美~级网站不卡| 国产日韩欧美在线视频观看| 亚洲精品一区二区三区樱花| 一区二区在线观看视频在线观看| 亚洲精品一区二区三区蜜桃久 | 欧美日韩一区精品| 久热精品视频在线观看一区| 欧美三级在线视频| 亚洲欧洲日本在线| 尤物九九久久国产精品的分类| 亚洲午夜激情网页| 亚洲卡通欧美制服中文| 久久久噜噜噜久久狠狠50岁| 午夜日韩电影| 欧美午夜精品久久久久久久| 亚洲黄一区二区三区| 揄拍成人国产精品视频| 欧美在线播放| 久久久777| 国产日韩欧美日韩| 亚洲女人天堂av| 亚洲综合精品一区二区| 欧美日韩综合| 日韩午夜免费| 一区二区三区av| 欧美精品国产精品日韩精品| 欧美激情第六页| 亚洲精品国偷自产在线99热| 久久人人九九| 欧美成人在线免费观看| 亚洲黄色尤物视频| 免费在线欧美视频| 亚洲第一成人在线| 亚洲精品一区二区三区在线观看| 久久免费视频网| 亚洲大胆人体在线| 亚洲欧洲一区| 欧美另类一区| 一区二区欧美在线| 亚洲欧美一区二区原创| 国产精品久久久久久久久久直播| 亚洲深夜福利| 久久精品一区二区三区中文字幕| 国产精品一区二区在线| 欧美在线观看一区| 免费一级欧美片在线观看| 最新日韩在线| 欧美三区不卡| 先锋亚洲精品| 欧美黄色一区| 亚洲一区视频| 永久免费毛片在线播放不卡| 麻豆精品一区二区综合av| 亚洲国产高清aⅴ视频| 亚洲少妇中出一区| 国产日韩成人精品| 麻豆精品在线视频| 9国产精品视频| 久久人人超碰| 99国产精品久久| 国产手机视频一区二区| 蜜桃av久久久亚洲精品| 一区二区三区四区五区视频| 久久精品91| 亚洲免费观看在线观看| 国产精品一二三视频| 另类尿喷潮videofree| 日韩视频―中文字幕| 久久网站热最新地址| 一本色道久久综合| 国语自产偷拍精品视频偷| 欧美猛交免费看| 欧美在线一区二区| 洋洋av久久久久久久一区| 久久久精品2019中文字幕神马| 亚洲精品国产品国语在线app| 国产精品少妇自拍| 欧美成人黄色小视频| 欧美一级久久久| 99视频在线观看一区三区| 久久午夜精品| 欧美影院成人| 一本色道久久88精品综合| 国产一区二区三区免费不卡| 欧美日韩在线第一页| 老司机久久99久久精品播放免费| 亚洲免费视频网站| 日韩午夜三级在线| 亚洲第一在线综合在线| 久久久久久噜噜噜久久久精品| 亚洲一区免费观看| 亚洲人人精品| 亚洲国产日韩欧美在线动漫| 国产一区二区欧美| 国产日本亚洲高清| 国产精品进线69影院| 欧美日韩亚洲免费| 欧美日韩国产在线| 欧美成ee人免费视频| 久久综合网hezyo| 欧美在线观看视频一区二区| 亚洲欧美精品| 亚洲欧美日韩久久精品| 一区二区三区回区在观看免费视频| 欧美激情综合色| 欧美福利影院| 欧美激情国产日韩| 亚洲国产日韩在线| 亚洲风情亚aⅴ在线发布| 欧美激情精品久久久久久久变态| 久久伊人亚洲| 亚洲第一色中文字幕| 欧美激情国产日韩| 亚洲国产欧美一区| 99riav久久精品riav| 99在线精品视频| 一个色综合导航| 亚洲欧美清纯在线制服| 香蕉久久一区二区不卡无毒影院 | 久久久九九九九| 久久国产精品久久久久久电车| 欧美一区二区免费观在线| 欧美一区二区视频在线观看| 欧美一区二区私人影院日本| 久久精品国产精品亚洲精品| 久久综合色婷婷| 欧美日韩国产欧| 国产精品久久久久久久久久直播| 国产精品午夜av在线| 国产一区二区在线观看免费| 精品福利av| 亚洲精品视频在线观看免费| 国产精品99久久久久久白浆小说| 欧美一区二区免费视频| 免费影视亚洲| 一本一本大道香蕉久在线精品| 亚洲欧美日韩久久精品| 免费日韩av电影| 欧美日韩直播| 国内精品亚洲| 一区二区成人精品| 久久三级福利| 99国产精品视频免费观看一公开| 亚洲免费一级电影| 久久综合影音| 国产精品视频一区二区高潮| 亚洲成色999久久网站| 亚洲私人影院在线观看| 久久躁狠狠躁夜夜爽| 亚洲毛片在线看| 久久久久一本一区二区青青蜜月| 欧美精品午夜| 在线观看欧美日本| 亚洲欧美国产不卡| 欧美激情四色| 久久成人免费| 国产精品一二三四区| 日韩一级欧洲| 欧美大色视频| 久久精品在线| 国产欧美日韩一区二区三区| 一区二区三区视频在线| 欧美激情第1页|