在一些場景下可以選擇任何一種或多種panel實現一種效果。本文談一下在同一場景下使用哪種panel效能會更好。
新建乙個wpf專案,各放置stackpanel,canvas,grid,看下所佔的記憶體,如圖1,2,3
圖1 grid
圖2 canvas
圖3 stackpanel
我們可以看到空內容情況下記憶體容量是stackpanel=canvas檢視panel類的onrender方法,各類面板的效能差異主要體現在render的過程中計算(measure)和排列(arrange)不同容器內容的功能差異導致的效能消耗。
1.measure和arrange:
在measureoverride方法裡,影響效能的是自適應arrange的屬性。舉例:horizontalalignment.strech或grid中columndefinition的width="auto"。
只要設定了這些屬性,則panel控制項的子控制項都將會拉伸或者自動計算大小。
在arrangeoverride方法裡,影響效能的是不同的子控制項在panel位置之間的相互作用的複雜度以及子控制項的數目。
2.panel類的派生
在專案中有些特殊需求wpf現有提供的布局控制項滿足不了需求,這時候需要我們寫自定義控制項。舉例:在erp應用軟體中大量的資料圖表需要在ui顯示,這時候
我們需要在布局中顯示類似html中table 百分比的功能。兩種做法:1.binding副控制項的實際大小通過converter計算百分比 2.派生自布局控制項重寫功能
如果使用方法1通過預設控制項binding,通過memory profiler看到其效能表現相當糟糕。
使用方法2.繼承自布局控制項,其效能消耗小了很多。
下面我們分別看下grid,canvas,stackpanel
1.grid:
grid定義乙個可設定的的網格區域,可以將該網格區域分割成多行與多列。
如果使用按比例(如:3*,7*)或者auto調節行列大小,grid 是乙個效能損耗最嚴重的面板控制項。
原因是:當visualtree上child的原始大小和布局位置通過 grid 來指定的時候,child的區域大小計算非常複雜。同時,在所有panel型別控制項中,它的布局過程是最複雜的。
效能評估:它的計算效能和排列效能屬於中低水平。
2.canvas:
canvas定義了乙個區域內的座標系,child可根據該座標系決定處於布局中的絕對位置。
canvas 擁有在所有控制項中最好的排列(arrange)效能,在計算(measure)步驟中也有很好的效能表現。
原因是:針對arrange,canvas的所有child位置都是絕對位置,是固定,直接指定的,canvas並沒有拉伸(strech,uriform,fill etc...)的屬性,所有child都是使用自己的原始尺寸。
效能評估:效能最好,無論是計算效能和排列效能。
3.stackpanel:
stackpanel定義了區域內的child將按照水平方向或垂直方向排列成一行。
在 stackpanel 內,child的尺寸將如此計算:根據 stackpanel 的排列(orientation)方向,如:垂直方向,則它的child在水平方向的尺寸則使用原始尺寸或相對尺寸,而垂直方向的尺寸則使用原始尺寸(對齊屬性在此方向並不影響它的尺寸)。由於它的排列(arrange)步驟相對簡單,只是將child按順序的逐個排列,所以它在這步驟的效能在所有panel控制項中排前列。
效能評估:計算(measure)效能屬於中等水平,排列(arrange)效能屬於高等水平。
**:
1截圖,如圖4,5,6:"performancedemo.mainwindow
"2 xmlns="
"3 xmlns:x="
"4 title="
mainwindow
" height="
350" width="
525">525
3536"10
" canvas.top="
5">test37"
100" canvas.top="
15">test38"
90" canvas.top="
25">test39"
80" canvas.top="
35">test40"
70" canvas.top="
45">test41"
60" canvas.top="
55">test42"
50" canvas.top="
65">test43"
40" canvas.top="
75">test
4445
圖4 grid
圖5 canvas
圖6 stackpanel
結論:布局過程的複雜性直接取決於使用的 panel 派生元素的布局行為。 例如,grid 或 stackpanel 控制項提供的功能比 canvas 控制項多很多。 功能大大提高的代價是效能成本也大大提高。 但是,如果不需要 grid 控制項提供的功能,則應使用成本較低的布局控制項,如 canvas 或自定義面板。
WPF Panel的效能分析
在一些場景下可以選擇任何一種或多種panel實現一種效果。本文談一下在同一場景下使用哪種panel效能會更好。新建乙個wpf專案,各放置stackpanel,canvas,grid,看下所佔的記憶體,如圖1,2,3 圖1 grid 圖2 canvas 圖3 stackpanel 我們可以看到空內容情...
mysql 效能分析 Mysql效能分析
優化mysql資料庫效能的十個引數 1 max connections 允許的同時客戶的數量。增加該值增加 mysqld 要求的檔案描述符的數量。這個數字應該增加,否則,你將經常看到 too many connections 錯誤。預設數值是100,我把它改為1024 2 record buffer...
mysql效能分析方法 mysql 效能分析方法
1.explain分析法 explain 分析查詢語句 1 id列數字越大越先執行,如果說數字一樣大,那麼就從上往下依次執行 2 select type查詢型別 primary dependent subquery等 3 table表名 4 type 從上到下效能依次下降 system 表中只有一行...