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

流量統計:
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 日需博客 閱讀(1394) 評論(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>
            久久精品一二三区| 销魂美女一区二区三区视频在线| 国内一区二区在线视频观看| 欧美激情一区二区三区全黄 | 亚洲日本免费电影| 亚洲电影免费观看高清完整版在线 | 一区免费视频| 在线国产精品一区| 国产精品高精视频免费| 欧美日韩调教| 国产日韩欧美在线播放不卡| 欧美日韩国产色站一区二区三区| 欧美国产三区| 欧美在线免费视屏| 欧美在线精品免播放器视频| 亚洲精品日产精品乱码不卡| 99精品视频一区| 性做久久久久久久久| 99re6这里只有精品| 亚洲伊人第一页| 久久久久成人精品免费播放动漫| 亚洲视频导航| 久久精品国产久精国产爱| 欧美成人一区二区三区在线观看| 亚洲一区三区电影在线观看| 亚洲人成网站在线播| 国产亚洲人成网站在线观看| 国产精品美女一区二区| 一区三区视频| 国产视频自拍一区| 亚洲日本aⅴ片在线观看香蕉| 国产午夜精品在线观看| 亚洲日本激情| 久久国产精品99国产精| 午夜欧美大尺度福利影院在线看| 日韩午夜av| 亚洲免费电影在线| 欧美一区视频| 日韩视频精品在线观看| 99精品国产在热久久| 久久视频在线免费观看| 国产日韩在线视频| 国产午夜亚洲精品羞羞网站 | 午夜精品久久久久影视| 久久久久**毛片大全| 一区二区三区视频在线| 正在播放亚洲一区| 一区二区精品在线| 亚洲综合大片69999| 亚洲视频国产视频| 亚洲在线一区| 亚洲人成在线观看| 亚洲精品久久久久中文字幕欢迎你| 欧美一区二区三区四区在线观看| 亚洲国产精品一区二区第四页av| 久久精品国产99精品国产亚洲性色 | 99视频有精品| 久久人人九九| 亚洲欧美高清| 久热re这里精品视频在线6| 久久亚洲精品一区| 国产一区视频在线观看免费| 欧美亚洲免费电影| 免费视频亚洲| 亚洲乱码国产乱码精品精98午夜 | 日韩亚洲欧美一区| 欧美激情精品久久久| 欧美专区18| 欧美搞黄网站| 亚洲精品小视频在线观看| 亚洲成人在线免费| 亚洲少妇一区| 欧美a级片网| 久久免费偷拍视频| 亚洲人成人99网站| 久久九九99| 亚洲国产精品女人久久久| 蜜臀av性久久久久蜜臀aⅴ四虎 | 国内久久视频| 久久精品亚洲一区二区三区浴池| 亚洲亚洲精品三区日韩精品在线视频 | 亚洲一区尤物| 国产精品99久久久久久久女警 | 韩国在线视频一区| 夜夜嗨av一区二区三区中文字幕| 亚洲永久免费精品| 欧美激情视频给我| 午夜精品久久久99热福利| 欧美精品一区二区三区视频| 国产真实乱偷精品视频免| 久久久噜噜噜久久中文字免| 男女精品视频| 亚洲欧美一级二级三级| 香蕉乱码成人久久天堂爱免费| 欧美日韩国产综合一区二区| 亚洲综合另类| 香蕉久久精品日日躁夜夜躁| 亚洲国产第一| 欧美日韩在线不卡一区| 亚洲国产天堂久久综合| 久久久久99| 欧美精品性视频| 久久精品国内一区二区三区| 欧美福利一区二区三区| 亚洲大片一区二区三区| 一区二区冒白浆视频| 亚洲国产99| 亚洲第一级黄色片| 国产精品一区免费观看| 亚洲电影在线| 国产伊人精品| 亚洲午夜激情| 99在线|亚洲一区二区| 久久精品国产第一区二区三区最新章节| 久久一区中文字幕| 亚洲无限乱码一二三四麻| 老牛影视一区二区三区| 欧美在线日韩精品| 久久偷看各类wc女厕嘘嘘偷窃| 国产一区二区激情| 久久久久9999亚洲精品| 久久精品国产第一区二区三区最新章节 | 久久电影一区| 欧美三级午夜理伦三级中文幕| 一区二区成人精品 | 欧美一区国产一区| 亚洲一区观看| 欧美一区二区三区日韩视频| 国产一区久久| 亚洲在线不卡| 亚洲欧美另类在线| 欧美日韩国产大片| 亚洲美女在线一区| 国产精品免费一区二区三区观看| 亚洲精品久久久久久久久久久久| 欧美黄色免费| 亚洲电影免费| 欧美在线看片| 久久久激情视频| 欧美激情欧美激情在线五月| 欧美激情自拍| 国产精品chinese| 久久国产精品亚洲77777| 国产精品第一区| 亚洲欧美韩国| 91久久在线| 欧美成人黑人xx视频免费观看| 亚洲第一中文字幕| 久久综合色8888| 亚洲国产日韩一区二区| 99国产精品自拍| 久久精品夜色噜噜亚洲a∨ | 亚洲精品视频在线观看免费| 欧美巨乳波霸| 欧美一级视频免费在线观看| 久久久水蜜桃| 亚洲综合不卡| 久久先锋影音| 亚洲一区制服诱惑| 久久综合九色综合久99| 欧美激情在线狂野欧美精品| 99视频在线精品国自产拍免费观看 | 欧美岛国激情| 亚洲另类在线视频| 久久er精品视频| 亚洲无吗在线| 国产午夜亚洲精品理论片色戒| 亚洲国产欧美一区二区三区同亚洲| 麻豆视频一区二区| 亚洲欧洲日产国产网站| 亚洲国产精品电影| 欧美高潮视频| 亚洲性感激情| 欧美福利一区| 亚洲国产99| 欧美亚男人的天堂| 久久精品麻豆| 久久久久国产精品厨房| 国产麻豆综合| 美日韩精品免费观看视频| 亚洲一区二区视频在线| 亚洲第一精品福利| 久久精品成人一区二区三区蜜臀 | 久久久亚洲高清| 亚洲国产人成综合网站| 国产伦精品一区二区三区照片91| avtt综合网| 老司机免费视频久久| 好吊成人免视频| 欧美三级电影一区| 久久久久国产精品麻豆ai换脸| 亚洲三级免费| 国产精品日日摸夜夜添夜夜av| 男男成人高潮片免费网站| 亚洲综合三区| 一二三区精品福利视频| 欧美日韩黄视频| 99精品99久久久久久宅男| 欧美14一18处毛片| 久久久久久久综合|