您好,登錄后才能下訂單哦!
性能是考量一個控件產品好壞的重要指標,與產品的功能有著同等重要的地位。用戶在選擇一款控件產品的時候基本都會親身試驗比較同類產品的性能。作為選購那個控件重要因素之一。
控件的性能指什么
性能優化的原則
如何發現性能瓶頸
上一節提到,性能優化的第一步就是發現性能瓶頸,這一節主要介紹定位性能瓶頸的一些實踐。
// 在這里寫一些可能消耗內存的代碼,例如,如果想了解創建一個GcMultiRow控件需要多少內存可以執行以下代碼
long start = GC.GetTotalMemory(true);
var gcMulitRow1 = new GcMultiRow();
GC.Collect();
// 確保所有內存都被GC回收
GC.WaitForFullGCComplete();
long end = GC.GetTotalMemory(true);
long useMemory = end - start;
這里把一個操作循環執行了1000次,最后再把消耗的時間除以1000來確定最終消耗的時間。可以是結果更準確穩定,排除意外數據。
性能優化的方法和技巧
定位了性能問題后,解決的辦法有很多。這個章節會介紹一些性能優化的技巧和實踐。
for(int i = 0; i < gcMultiRow.RowCount; i++)
{
// Do something;
}
以上代碼一般情況下是沒有問題的,但是,如果GcMultiRow的行數比較大。而RowCount屬性的取值又比較慢的時候就需要使用緩存來做性能優化。
int rowCount = gcMultiRow.RowCount; for (int i = 0; i < rowCount; i++) { // Do something; }public static class GDIPool
{
Dictionary<Color, Brush > _cacheBrush = new Dictionary<Color, Brush>();
Dictionary<Color, Pen> _cachePen = new Dictionary<Color, Pen>();
public static Pen GetPen(Color color)
{
Pen pen;
if_cachePen.TryGetValue(color, out pen))
{
return pen;
}
pen = new Pen(color);
_cachePen.Add(color, pen);
return pen;
}
}
一般做法下由于構造對象A的同時要構造對象B導致了A的構造速度也變慢了。優化做法:
public class A { private B _b; public B BProperty { get { if(_b == null) { _b = new B(); } return _b; } } }
操作 |
List |
Dictionary |
索引 |
快 |
慢 |
Find(Contains) |
慢 |
快 |
Add |
快 |
慢 |
Insert |
慢 |
快 |
Remove |
慢 |
快 |
當需要大量取值的時候,這樣的取法會帶來性能問題。優化方法如下:
object value; if(_dic.TryGetValue("Key", out value)) { return value; }使用TryGetValue可以比先Contain再取值提高一倍的性能。
這里比較慢的操作就是EnsureFunctions函數,是在另一個線程里執行的,不會影響主線程的響應。當然,使用多線程是一個比較有難度的方案,需要充分考慮跨線程訪問和死鎖的問題。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。