C程式最佳化之路 (轉)

amyz發表於2007-10-17
C程式最佳化之路 (轉)[@more@]

C之路:namespace prefix = o ns = "urn:schemas--com::office" />

 

  本文講述在編寫C程式程式碼的常用最佳化辦法,分為I/O篇,篇,演算法篇,MMX篇。

一.I/O

  如果有讀寫的話,那麼對檔案的訪問將是影響程式執行速度的一大因素。提高檔案訪問速度的主要辦法有兩個:一是採用記憶體對映檔案,二是使用記憶體緩衝。下面是一組測試資料(見《環境高階》3.9節),顯示了用18種不同的快取長度,讀1 468 802位元組檔案所得到的結果。

緩衝大小

(秒)

CPU(秒)

時鐘時間(秒)

迴圈次數(秒)

1

23.8

397.9

423.4

1 468 802

2

12.3

202.0

215.2

734 401

4

6.1

100.6

107.2

367 201

8

3.0

50.7

54.0

183 601

16

1.5

25.3

27.0

91 801

32

0.7

12.8

13.7

45 901

64

0.3

6.6

7.0

22 951

128

0.2

3.3

3.6

11 476

256

0.1

1.8

1.9

5 738

512

0.0

1.0

1.1

2 869

1 024

0.0

0.6

0.6

1 435

2 048

0.0

0.4

0.4

718

4 096

0.0

0.4

0.4

359

8 192

0.0

0.3

0.3

180

16 384

0.0

0.3

0.3

90

32 768

0.0

0.3

0.3

45

65 536

0.0

0.3

0.3

23

131 072

0.0

0.3

0.3

12

可見,一般的當記憶體緩衝區大小為8192的時候,就已經是最佳的了,這也就是為什麼在H.263等影像編碼程式中,緩衝區大小為8192的原因(有的時候也取2048大小)。使用記憶體緩衝區方法的好處主要是便於移植,佔用記憶體少,便於實現等。下面是讀取檔案的C偽碼:

  int Len;

BYTE buffer[8192];

  ASSERT(buffer==NULL);

  If buffer is empty{

  Len=read(File,buffer,8192);

  If(len==0) No data and exit;

  }

 

但是如果記憶體比較大的時候,採用記憶體對映檔案可以達到更佳效能,並且程式設計實現簡單。記憶體對映的具體使用說明見msdn October 2001中的PlatfoSDK

Documentation—Base Services—File Storage—File Map。下面是一點建議:

① 記憶體對映檔案不能超過虛擬記憶體的大小,最好也不要太大,如果記憶體對映檔案接近虛擬記憶體大小的時候,反而會大大降低程式的速度(其實是因為虛擬記憶體不足導致系統執行降低),這個時候,可以考慮分塊對映,但是我覺得如果這樣,還不如直接使用記憶體緩衝來得直接一些。

② 可以將兩種方法統一使用,如我在編大影像檔案資料處理的時候(因為是Unix工作站,記憶體很大GB單位)使用了記憶體對映檔案,但是為了最佳效能,也使用了一行影像快取,這樣在讀取檔案中資料的時候,就保證了僅僅是順序讀寫(記憶體對映檔案中,對順序讀寫有專門的最佳化)。

③ 在寫檔案的時候使用記憶體對映檔案要有一點小技巧:應該先建立足夠大的檔案,然後將這個檔案對映,在處理完這個檔案的時候,用SetFilePointer和SetEndOfFile來對檔案進行截尾。

④ 對記憶體對映檔案進行操作與對記憶體進行操作類似(使用起來就象陣列一樣),那麼如果有大塊資料讀寫的時候,切記使用memcpy()函式(或者CopyMemory()函式)

 

  總之,如果要使用記憶體對映檔案,必須:1.處理的檔案比較的小,2.處理的檔案很大,但是執行環境記憶體也很大,並且一般在執行該程式的時候不執行其他消耗記憶體大的程式,同時使用者對速度有特別的要求,而且對記憶體佔用沒有什麼要求。如果以上兩個條件不滿足的時候,建議使用記憶體緩衝區的辦法。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-977202/,如需轉載,請註明出處,否則將追究法律責任。

相關文章