最近工作遇到了乙個問題,原本在32位android機上跑的好好的程式,在某些64位機上卻變慢了許多。感覺很奇怪,所以google了一下原因,網上給出的原因大部分是過多使用指標。可是為什麼過多使用指標就會造成程式變慢呢?結合網上的資料,和自己的理解,我認為是如下原因造成的:
(1)因為64位比32位的指標大了一倍,定址空間從2^32大幅上公升到2^64,但是這也帶來了額外的問題。乙個指標的儲存空間也變成了原來的兩倍,在做指標運算時,例如int*ptr,*(ptr+5),移動距離也變為了原來的兩倍。
(2)如果cpu的快取大小不變,假設為10k=1024*10byte。原來乙個指標只占用4byte,快取中能儲存2560個指標。現在由於指標占用空間變大,只能儲存1280個了。
(3)假設程式中需要讀取某個指標的資料,可以簡單分為兩種情況:如果該資料在快取中,那麼直接做指標取資料運算;如果該資料不在快取中,程式就需要從記憶體中尋找資料並更新快取(這部分機制不是特別熟悉,姑且這麼理解吧……)。
(4)在上述情況下,如果程式中對記憶體的訪問經常「跳躍」的話(例如不是i++,而是i+=10),考慮到64位機的指標長度變成了32位機的兩倍,那麼移動時會比之前慢一些。更嚴重的是,程式還會更頻繁的在快取中尋找資料失敗,導致從記憶體尋找資料並更新快取,這樣讀取資料操作的耗時就會提高,程式的執行速度也會顯著下降。
綜上所述,如果某個android機廠商為了偷工減料,把cpu公升級成64位後,快取容量卻不公升級,而恰好你的程式中又有很多不連續的指標運算,那麼程式的執行速度就會變慢很多(我們這邊的程式執行速度變慢了50%)。另一方面,如果某個android機廠商比較有良心的話,把cpu公升級成64位後,快取容量也跟著公升級了,那麼程式變慢的現象就基本不會出現。以上兩種情況,我在不同廠商的手機上都遇到過,就不點名了。對於android開發者,尤其是做ndk開發的,還是需要多考慮記憶體使用方面的優化,如果有頻繁的記憶體申請/釋放,最好還是利用記憶體池等技術避免。
vs2005的MFC程式在64位機上不能執行
出現上述錯誤大多因為該機上沒有安裝vs2005程式,vs2005要執行需要一些必要的檔案,沒有新增到你發布的可執行檔案目錄下,所以程式不能執行。解決方法 安裝目錄 microsoft visual studio 8 vc redist x86 這個目錄下面,你會找到上面xml的item中列出來的mi...
在64位linux下編譯32位程式
一般情況下我們最好是在乙個平台上編譯本平台的二進位制程式,比如在32位平台上編譯32位程式而在64位平台上編譯64位程式。現在64位的系統 這裡主要指x86 64系統,包括amd64和intel的em64t 已經開始廣泛的使用起來了,甚至於你現在要是想買32位的處理器根本就沒有。64位的系統在效能和...
在64位linux下編譯32位程式
留存備份 一般情況下我們最好是在乙個平台上編譯本平台的二進位制程式,比如在32位平台上編譯32位程式而在64位平台上編譯64位程式。現在64位的系統 這裡主要指x86 64系統,包括amd64和intel的em64t 已經開始廣泛的使用起來了,甚至於你現在要是想買32位的處理器根本就沒有。64位的系...