人人做人人澡人人爽欧美,国产主播一区二区,久久久精品五月天,羞羞视频在线观看免费

當(dāng)前位置:蘿卜系統(tǒng)下載站 > 技術(shù)開發(fā)教程 > 詳細(xì)頁面

精彩圖文詳細(xì)教程:迅速初始化內(nèi)存(1)

精彩圖文詳細(xì)教程:迅速初始化內(nèi)存(1)

更新時(shí)間:2022-07-29 文章作者:未知 信息來源:網(wǎng)絡(luò) 閱讀次數(shù):


許多計(jì)算密集型的應(yīng)用都需要處理大量?jī)?nèi)存,這種應(yīng)用中的內(nèi)存初始化是一個(gè)常規(guī)操作,而內(nèi)存和CPU內(nèi)部的數(shù)據(jù)交換之間的速度瓶頸決定了內(nèi)存初始化將會(huì)占用可觀的時(shí)間。但因?yàn)閼?yīng)用程序初始化內(nèi)存往往調(diào)用CRT的memset或者Windows API的ZeroMemory,很少有人在初始化方面進(jìn)行優(yōu)化。

另一方面,現(xiàn)在的應(yīng)用硬件一般配置都比較好,大部分應(yīng)用都運(yùn)行在PII之上,但我們?cè)谑褂弥T如VC之類的編譯環(huán)境時(shí)往往選擇速度優(yōu)化,并選擇合適的處理器,然后寄希望于編譯器給我們生成優(yōu)化的結(jié)果,結(jié)果往往發(fā)現(xiàn)并不如意。

在我們的一個(gè)圖像處理項(xiàng)目中,需要大量?jī)?nèi)存操作,而且多個(gè)線程同時(shí)運(yùn)行,內(nèi)存存取成為了各個(gè)模塊的競(jìng)爭(zhēng)資源,所以對(duì)內(nèi)存存取優(yōu)化成為項(xiàng)目的關(guān)鍵。在努力減少內(nèi)存操作遍數(shù)的基礎(chǔ)上,加快內(nèi)存初始化成為我們的改進(jìn)重點(diǎn)。

在用VC各種手段都沒有太多改進(jìn)后,我們把目光轉(zhuǎn)向處理器特征。從Pentium系列開始,一方面Intel在不斷提高CPU主頻,同時(shí)也在針對(duì)多媒體等應(yīng)用相繼推出MMX/SSE/SSE2,增加了許多多位快速處理指令。在高層語言方面,Intel的C++ Compiler提供了針對(duì)不同處理器的最優(yōu)化結(jié)果。但在一個(gè)成熟項(xiàng)目中貿(mào)然使用另外一種編譯環(huán)境的風(fēng)險(xiǎn)較大,所以我們從Intel環(huán)境中抽取了memset的實(shí)現(xiàn),重新組織了一個(gè)Lib,并在我們的項(xiàng)目中針對(duì)內(nèi)存初始化進(jìn)行了改動(dòng),并鏈接到抽取的lib庫(kù)中。在內(nèi)存初始化方面有了一個(gè)較大的提高。

下面我們用測(cè)試?yán)诱f明該過程。

一個(gè)例子

在測(cè)試程序中,分別調(diào)用微軟C庫(kù)的memset和intel版本的memset分別對(duì)100M內(nèi)存進(jìn)行60遍初始化,,為了模擬多線程環(huán)境,啟動(dòng)了兩個(gè)線程同時(shí)進(jìn)行內(nèi)存初始化。測(cè)試時(shí)使用了Release版,為了方面查看包含了調(diào)試信息(調(diào)試信息無影響)。測(cè)試結(jié)果:

MSC 版本:12.453~12.547秒

Intel C版本:4.375~4.531秒

可見在大量?jī)?nèi)存操作時(shí)差別比較大。對(duì)內(nèi)存存取密集型項(xiàng)目,因?yàn)閮?nèi)存存取往往是瓶頸,應(yīng)該還可以提高整體處理性能。

下面是例子的代碼:

// 本程序示例了使用微軟CRT的memset和Intel優(yōu)化的memset初始化內(nèi)存的速度差異

// Lihw.

#include

#include

#include

extern "C"

void * __cdecl __intel_new_memset(void *, int, size_t);

#pragma comment(lib,"intelmem.lib")

#define SIZE 1024*1024*100

void threadfunc(void *dummy)

{

LPBYTE lpByte = (LPBYTE)dummy;//new BYTE[SIZE];

int j;

#define LoopTimes 60

DWORD dwStart, dwTime1,dwTime2;

//

//intel version

dwStart = GetTickCount();for (j=0; j< LoopTimes; j++)

{

__intel_new_memset(lpByte,1,SIZE);

}

dwTime1 = GetTickCount() - dwStart;

//MS crt version

dwStart = GetTickCount();

for (j=0; j< LoopTimes; j++)

{

memset(lpByte,1,SIZE);

//ZeroMemory(lpByte,SIZE);

}

dwTime2 = GetTickCount() - dwStart;

//delete []lpByte;

printf("Intel=%dms MSC=%dms\n",dwTime1,dwTime2);
}

int main(int argc, char* argv[])

{

#define THREADS 2

HANDLE hThread[THREADS]; //array to hold thread handle

LPBYTE lpByte[THREADS]; //Array to hold thread-specific memory

int i;

//Count mem alloc time. Debug version is very long

DWORD dwStart = GetTickCount();

for (i=0; i

溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

本類教程下載

系統(tǒng)下載排行

網(wǎng)站地圖xml | 網(wǎng)站地圖html
主站蜘蛛池模板: 巴里| 云阳县| 烟台市| 辰溪县| 崇阳县| 许昌市| 策勒县| 娱乐| 威海市| 勐海县| 印江| 马公市| 定州市| 平泉县| 阿克陶县| 车致| 比如县| 望江县| 新平| 重庆市| 蒙自县| 开封县| 永安市| 阜城县| 广汉市| 乌拉特前旗| 大丰市| 阿图什市| 济阳县| 大邑县| 南江县| 乌拉特前旗| 防城港市| 油尖旺区| 于都县| 龙游县| 静安区| 扬中市| 疏附县| 岚皋县| 合阳县|