C程式最佳化之路 (轉)
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- C程式最佳化之路(二) (轉)C程式
- C程式最佳化之路(三) (轉)C程式
- C++ 層次程式碼最佳化 (轉)C++
- C++程式碼最佳化方法總結(一) (轉)C++
- C++程式碼最佳化方法總結(四) (轉)C++
- C++程式碼最佳化方法總結(三) (轉)C++
- C++程式碼最佳化方法總結(二) (轉)C++
- CSS程式碼重構與最佳化之路CSS
- 我的C學習之路 (轉)
- 程式設計之路 (轉)程式設計
- 最佳化--C程式設計師之終極標靶 (轉)C程式程式設計師
- 關於C++程式碼最佳化的方法總結(轉)C++
- 程式設計之路-介面美化 (轉)程式設計
- C/C++自學之路C++
- Delphi 程式碼最佳化——字串篇 (轉)字串
- 如何“玩轉”MongoDB?羅輯思維資料庫效能最佳化之路!MongoDB資料庫
- 程式碼最佳化試驗——短迴圈最佳化(下) (轉)
- 程式碼最佳化試驗——短迴圈最佳化(上) (轉)
- C#聊天程式 (轉)C#
- Delphi程式碼最佳化 完結篇 (轉)
- 最佳化J2ME程式大小 (轉)
- 一個 Shell 程式的效能最佳化(轉)
- c#之路漫漫長C#
- 最佳化J2ME應用程式 (轉)
- Delphi程式碼最佳化(二) 整數篇 (轉)
- Delphi程式碼最佳化(三) 浮點篇 (轉)
- Oracle資料庫及應用程式最佳化(轉)Oracle資料庫
- 寫好C程式的秘籍(轉)C程式
- C++中用函式模板實現和最佳化抽象操作(轉)C++函式抽象
- 玩轉架構之路架構
- |轉| java學習之路Java
- windows最佳化(轉)Windows
- Perl程式與c程式速度的比較(轉)C程式
- 小程式挖坑之路
- LinkAI RAG知識庫平臺最佳化之路AI
- 使用內部和匿名類最佳化Java程式碼(轉)Java
- c++學習進階之路
- c# winform程式設計轉例C#ORM程式設計