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

流量統計:
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>
            亚洲欧洲视频在线| 亚洲精品免费一二三区| 91久久午夜| 久久综合激情| 国外视频精品毛片| 噜噜噜久久亚洲精品国产品小说| 亚洲天堂av在线免费观看| 欧美日韩喷水| 小黄鸭精品aⅴ导航网站入口| 日韩一二三在线视频播| 国产精品国产三级国产专区53 | 久久久久久尹人网香蕉| 亚洲毛片视频| 国产欧美一区二区精品性| 欧美一区二区视频97| 欧美在线观看天堂一区二区三区| 国产一区二区三区电影在线观看| 免费成人黄色| 欧美激情第二页| 欧美在线观看视频| 免费看亚洲片| 欧美在线观看你懂的| 欧美精品一区在线| 久久青草久久| 国产欧美日韩高清| 99国内精品久久| 日韩一区二区福利| 香蕉久久夜色| 午夜久久久久久| 欧美吻胸吃奶大尺度电影| 玖玖玖免费嫩草在线影院一区| 欧美精品午夜视频| 亚洲高清不卡在线| 一色屋精品视频在线观看网站| 一本久道久久久| 亚洲欧美成aⅴ人在线观看| 欧美激情一区在线观看| 亚洲电影免费观看高清完整版在线观看 | 激情视频亚洲| 蜜桃久久av一区| 免费成人黄色片| 91久久精品一区二区别| 噜噜噜噜噜久久久久久91| 另类成人小视频在线| 久久成人资源| 久久日韩精品| 91久久国产综合久久| 免费久久99精品国产| 亚洲裸体视频| 亚洲夜晚福利在线观看| 欧美日韩在线一二三| 亚洲亚洲精品在线观看 | 你懂的网址国产 欧美| 永久久久久久| 欧美三级午夜理伦三级中视频| 亚洲图片自拍偷拍| 久久永久免费| 亚洲欧美日本国产专区一区| 国产精品久久激情| 蜜桃精品一区二区三区| av成人免费| 欧美好骚综合网| 久久gogo国模啪啪人体图| 亚洲第一精品夜夜躁人人躁| 欧美日韩xxxxx| 久久免费视频在线观看| 亚洲人成啪啪网站| 久久精品国产亚洲高清剧情介绍| 亚洲国产精品高清久久久| 国产精品一区二区久久久| 欧美成人精品不卡视频在线观看| 亚洲欧洲av一区二区| 99国内精品| 一区二区欧美国产| 99热免费精品| 亚洲色图制服丝袜| 亚洲午夜av电影| 国内精品写真在线观看| 欧美午夜在线一二页| 欧美成人有码| 欧美日韩不卡合集视频| 欧美日韩在线播放| 亚洲精品一区二区三区樱花| 亚洲第一中文字幕在线观看| 美女免费视频一区| 欧美www在线| 亚洲区中文字幕| 国产精品99久久久久久有的能看 | 亚洲一区二区久久| 99av国产精品欲麻豆| 亚洲一二三区在线观看| 性色av一区二区三区| 久久深夜福利免费观看| 亚洲国产视频直播| 亚洲小说欧美另类社区| 久久精品一级爱片| 欧美精品在线观看一区二区| 国产精品视频| 1024国产精品| 在线亚洲精品| 欧美成人精品h版在线观看| 99精品视频免费观看| 久久久亚洲国产美女国产盗摄| 欧美日本不卡视频| 狠狠色香婷婷久久亚洲精品| 一本久久a久久精品亚洲| 久久久999精品免费| 亚洲破处大片| 久久免费国产精品1| 国产日韩欧美综合一区| 日韩视频在线免费| 女人色偷偷aa久久天堂| 性色av一区二区三区| 欧美色精品天天在线观看视频 | 亚洲国产高清一区二区三区| 在线视频亚洲| 欧美日韩亚洲另类| 最近看过的日韩成人| 国产有码在线一区二区视频| 一片黄亚洲嫩模| 亚洲最新中文字幕| 欧美日本精品在线| 日韩一区二区精品葵司在线| 欧美激情欧美激情在线五月| 久久国产主播精品| 国产又爽又黄的激情精品视频| 亚洲综合精品| 欧美在线一区二区| 在线免费观看日本欧美| 亚洲国产va精品久久久不卡综合| 暖暖成人免费视频| 亚洲一级黄色片| 亚洲欧美另类在线| 亚洲福利国产| 99精品99| 亚洲精品日韩在线观看| 91久久精品国产91性色tv| 欧美日韩一区不卡| 久久精品一区中文字幕| 欧美/亚洲一区| 香蕉久久夜色精品| 欧美v日韩v国产v| 欧美在线看片a免费观看| 麻豆91精品91久久久的内涵| 亚洲免费视频网站| 蜜桃av久久久亚洲精品| 欧美亚洲视频在线看网址| 久久婷婷综合激情| 欧美一区二区三区啪啪| 欧美成人精品在线观看| 久久精品官网| 国产精品综合网站| 亚洲视频第一页| 亚洲区一区二| 美国十次了思思久久精品导航| 欧美一区在线直播| 国产精品久久久久久五月尺 | 欧美国产第二页| 国产亚洲精品久久久久久| 一区二区三区免费网站| av不卡在线| 欧美屁股在线| 中文国产成人精品| 午夜精品影院在线观看| 亚洲一区二区三区高清不卡| 99www免费人成精品| 欧美激情一区二区三区不卡| 亚洲国产成人精品女人久久久 | 夜夜夜精品看看| 亚洲午夜91| 伊大人香蕉综合8在线视| 久久久噜噜噜久久中文字免| 久久久久青草大香线综合精品| 国内精品伊人久久久久av一坑| 先锋a资源在线看亚洲| 嫩草国产精品入口| 亚洲午夜精品久久久久久浪潮| 国产精品爱啪在线线免费观看| 亚洲一区二区视频在线观看| 久久久伊人欧美| 亚洲一区二区三区涩| 国产免费观看久久| 欧美成人高清| 欧美一区二区三区另类| 亚洲电影自拍| 久久国产精品久久w女人spa| 亚洲精品国产精品国产自| 国产精品男女猛烈高潮激情| 久久综合九色九九| 亚洲一区三区视频在线观看| 亚洲国产欧美在线| 久久精选视频| 性做久久久久久久免费看| 亚洲日本电影在线| 亚洲国产精品久久久久秋霞影院| 欧美日韩一本到| 欧美久久精品午夜青青大伊人| 久久亚洲不卡| 久久综合成人精品亚洲另类欧美 | 亚洲免费在线精品一区|