WPF Panel的效能分析

2021-06-14 07:08:48 字數 3019 閱讀 4651

在一些場景下可以選擇任何一種或多種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

"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,5,6:

圖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 表中只有一行...