2015/5/21

[Windows API] 減少記憶體用量,欺騙工作管理員專用 - SetProcessWorkingSetSize

有寫過程式的工程師應該都有遇過,常常使用者會說,為什麼你寫的程式吃掉我電腦這麼多的記憶體,認為工程師寫的程式一定有問題。有的時候或許真的是程式出了問題,但是有的時候卻是程式的功能必須讀入大量要使用的資料到記憶體,所以一定會用到大量的資料。

一般使用者會透過 Ctrl-Alt-Del,叫出工作管理員 (Task Manager) 來看程式記憶體的使用量。所以為了提升使用者的信心應付這樣難搞的使用者,我們只好透過一些小技巧,來讓程式的記憶體使用量看起來像是降低的情況。

在網路上你可以找到一個公開的 Window API – SetProcessWorkingSetSize,只要呼叫這個函數,你就可以把這個程式在工作管理員裡,顯示的記憶體用量減少。而這樣的動作,其實 Window 的每個程式都有,只要你把 Window 的視窗最小化,你就可以發現這個程式記憶體用量瞬間下降。

聽起來 SetProcessWorkingSetSize 是一個很有用的函數,那每個程式設計師不就要快點用?其實不是這樣。呼叫 SetProcessWorkingSetSize 這個函數,其實是釋放程式的 working set,但是其實對於你程式所需要使用的記憶體用量,並不會有所減少。反而造成原本記憶體用量大的程式,因為用了 SetProcessWorkingSetSize,一大堆的資料無法從記憶體內存取,導致一堆的 page fault,造成資料不斷的做 page swap,結果程式反而跑的更慢,performance 更差。

雖然 SetProcessWorkingSetSize 不是真的讓你的程式效能變好,但是對於一些不懂裝懂,只會找人麻煩的人來說,這也是一種讓某些人閉嘴的小撇步。不過對於寫程式的人,一定要記得不要以為呼叫 SetProcessWorkingSetSize 就可以世界太平,了解函數的真正行為,其實有可能隱藏後續會有大量 page fault 的錯誤,導致程式反而效率變差。所以不要以為這一招可以一直拿出來用,千萬要記得,出來混,總有一天要還的,這個只能當作是某些特別時期可以使用的特別手段。

沒有留言:

張貼留言