-
1 # 青梅嗅
-
2 # 外老師
匹夫無罪,懷璧其罪
for迴圈本身沒啥問題,它只是一種最常見的程式設計語句。題主的問題,本質上是一個軟體效能最佳化的問題。
定位問題,一定要找到其根本原因。效能最佳化尤其如此。
我通常的最佳化過程是這樣的:
定位慢的程式碼塊
首先利用一些除錯工具,按模組執行,統計每個模組的執行時間。這個步驟我通常使用VS2019自帶的除錯功能來完成。
按照執行時間,倒序排序,這樣就很輕鬆的知道那些模組速度慢了。
從最慢的程式碼塊開始最佳化
接下來從最慢的模組開始,逐個進行最佳化,將慢的問題各個擊破。最佳化一個模組,測試一個模組,對比最佳化的效果。只要這個模組,不是程式中最慢的模組了,就可以進行下一個模組的優化了。
當然,這個最佳化的過程可以不斷迭代,重複進行,直到整個程式的執行速度達到要求。
下面列舉一些影響效能的常見操作及最佳化思路:
IO操作
根據我多年的程式設計經驗,大部分效能問題,是IO操作太過於頻繁導致的。如何最佳化IO操作呢?
首先,嘗試最佳化軟體的工作流程或演算法,嘗試減少IO操作的次數。這是最根本的解決方法。比如常見關係資料庫中的B+樹索引,就是非常典型的案例。索引對於資料庫查詢效能的影響,相信用過的人都知道。
其次,是使用快取技術,加速IO操作的速度。快取技術,本質上,是使用速度快的IO,代替速度慢的IO。比如使用記憶體IO,代替磁碟IO,就可以取得數個量級的效能提升。
常規的方法,是每一次讀取一段資料,而不是一次讀取一條。很多程式語言中的檔案讀取,都是這樣設計的。
還有一種方法,就是使用記憶體代替硬碟,所有的IO都放到記憶體中進行。當然,會在適當的時候,不影響效能的前提下,進行資料的持久化操作,將資料同步到磁碟中。相信大家已經想到了,Redis就是這樣的典型。
通常來說各類IO的速度如下:
暫存器 >>>CPU快取>>記憶體>>磁碟>網路
耗時計算
除了IO之外呢,在一些計算密集型軟體當中,耗時計算就是導致速度慢的罪魁禍首了。
首先,最佳化耗時計算的根本方法,還是改進流程和演算法,這個和解決IO的問題是一致的。當然,這個比較難,非常考驗我們的水平。高水平的工程師,可以提升多個量級的效率最佳化。
其次,我們對演算法流程已經沒有什麼辦法最佳化的前提下,可以採用並行處理。如CPU多執行緒執行,GPU加速,分散式計算等等。
CPU並行,通常可以提升數倍或幾十倍的速度。因為CPU的核心數量有限。
GPU加速,理論上可以有更多的最佳化空間,因為GPU內部一般都有數量眾多的功能完善的計算單元。當下非常火爆的比特幣挖礦,就深諳此道,甚至把高階顯示卡逼到一卡難求的地步,真是洛陽紙貴啊。
當然,分散式就更加複雜了。不過目前有很多分散式相關的框架,降低了普通工程師搞分散式的門檻。這一點還是非常欣慰的。
當然,並行處理會加大軟體的複雜度,相關演算法可能也需要重新編寫,各個執行緒之間的狀態同步,資源共享等等問題,更是一團亂麻!很多人對此望而卻步!
-
3 # Cofire
這...是for自身慢,還是for內過程慢?
啥業務要求這麼高,覺得系統函式速度慢只能寫彙編了或者機器碼了。
如果業務過程慢,需要最佳化程式碼,或者多執行緒處理。
回覆列表
這根本就不是for的問題,而是for裡面的邏輯太耗費時間了,一般來說,不要把資源相關的程式碼放在for中間,比如檔案讀取,資料庫讀取,相反,應該在for之前把所有資料都讀取到記憶體,然後再記憶體中操作。另外還可以使用多執行緒來併發加速。供參考。