-
1 # 25765537
-
2 # 木星上的程式設計師
一,你的應用是cpu密集型還是io密集型?
如果你的系統為cpu計算密集型,單個執行緒的cpu時間片越大越好,這就要求你對執行緒池的執行緒數做限制,防止過多執行緒對資源進行搶奪。
二,你給系統判定的併發上限是多少?
每個系統的效能都有上限,過大的負載,會造成效能低下,過小會浪費系統資源,所以需要結合業務得到一個最優值。
三,你的系統架構是否做了最佳化?
四,程式是否業務可以最佳化?
有些場景,最佳化業務,可以減少程式的處理效能,降低事務的處理時間,是否有cpu輪詢,是否在複雜業務中大量使用CAS等等。
具體問題具體分析,最佳化是一條持久之路,沒有最優,只有更優。
-
3 # 程式碼飼養員天齊
既然題主提到了上下文切換的問題,你肯定是涉及到了併發程式設計的效能問題。
首先簡單說一下,什麼是上下文切換?在作業系統中,CPU從一個任務切換到另一個任務需要儲存當前任務的狀態並恢復另一個任務的狀態:當前執行任務轉為非執行狀態,另一個被選定的任務轉為執行狀態獲得CPU執行時間。上下文切換包括儲存當前任務的執行環境,恢復將要執行任務的執行環境。
上下文切換會切換會花費時間,過多的上下文切換就會花費相當可觀的時間,這就意味著消耗大量的CPU時間,這是對CPU資源的一種浪費。執行緒數越多可能就會產生越多的上下文切換,所以說不是執行緒數越多執行效率就越高。
那麼如何減少執行緒的上下文切換呢?
本人在實際工作中主要採取了一下幾個方面的措施:
第一、執行緒池執行緒數大小的設定。在設定執行緒數大小時一般會使用JDK預設介面設定的執行緒數。當然這個可以根據業務需要適度調整。
第二、鎖的使用。減少一些沒必要的鎖的使用,避免執行緒的頻繁掛起。
第三、減少阻塞情況,使用非同步處理機制。比如nio代替io阻塞模式等。
第四、使用cas演算法代替鎖的使用。
本人具有多年的java開發經驗,熟悉多種框架,熟悉網路程式設計,熟悉java安全程式設計,熟悉大資料,熟悉多種安全協議,有興趣的同學可以互相關注,互相學習!!!
回覆列表
上下文切換隻會發生在記憶體對映表切換時,對於執行緒來說,就是進行系統呼叫時,換句話說,儘量降低系統呼叫的頻率就可以了。