2

私は現在、アプリケーションのパフォーマンスの問題を調査しており、次の点を強調しています。

私はクラスを持っています-

public static class CommonIcons
{
    ...
    public static readonly System.Windows.Media.ImageSource Attributes = typeof(CommonIcons).Assembly.GetImageFromResourcePath("Resources/attributes.png");
    ...
}

テストハーネスとして、このクラスを使用して問題を示す次のコードがあります-

for (int loop = 0; loop < 20000; loop++)
{
    // store time before call

    System.Windows.Controls.Image image = new System.Windows.Controls.Image
                    {
                        Source = CommonIcons.Attributes,
                        Width = 16,
                        Height = 16,
                        VerticalAlignment = VerticalAlignment.Center,
                        SnapsToDevicePixels = true
                    };

    // store time after call
    // log time between before and after

}

ループの開始時の時間差は0.001秒未満ですが、20000が経過すると、これは0.015秒に増加します。

静的メンバーを使用せず、アイコンを直接参照する場合、パフォーマンスに影響はありません。

for (int loop = 0; loop < 20000; loop++)
{
    // store time before call

    System.Windows.Controls.Image image = new System.Windows.Controls.Image
                    {
                        Source = typeof(CommonIcons).Assembly.GetImageFromResourcePath("Resources/attributes.png"),
                        Width = 16,
                        Height = 16,
                        VerticalAlignment = VerticalAlignment.Center,
                        SnapsToDevicePixels = true
                    };

    // store time after call
    // log time between before and after

}

しかし、私の実際のプログラムでは、呼び出しのたびにイメージソースを作成したくないので(ガベージコレクションまでメモリを増やします)、静的メンバーが使用されるのはなぜですか。しかし、私もパフォーマンスヒットで生きることはできません。

元のコードがこのパフォーマンスヒットを引き起こしている理由を誰かが説明できますか?また、私がやろうとしていることに対するより良い解決策はありますか?

ありがとう

4

3 に答える 3

1

ガベージコレクションと関係があるようなにおいがします。最初のケースで問題を引き起こしているImageSourceとの間に何らかの結合があるのではないかと思います。Imageテストハーネスのメモリ使用量がそれぞれの場合にどのように見えるかを確認しましたか?

Source興味深いことに、各反復の最後にをnullに設定するとどうなりますか?これは少しばかげていることは知っていますが、それはテストハーネスであることの当然の帰結です:)それがソースと画像の間のリンクであることをさらに示すかもしれません...

于 2010-09-23T11:40:43.657 に答える
0

CommonIconsクラスに「Resources/attributes.png」のような定数文字列のみを保存できますか?

于 2010-09-23T11:46:27.093 に答える
0

静的メンバーとそうでないものの違いはありませんが、最初のバージョンでは、すべて同じimagesourceを持つ20000のイメージを作成するということです。何が起こっているのか正確にはわかりませんが、内部では、imagesourceとimageの間の通信を処理するデリゲートが自動的に作成される可能性があり、imagesourceでイベントが発生するたびに、20000クライアントに通知する必要があるため、これは大規模です。パフォーマンスヒット。

2番目のバージョンでは、20000で作成された各イメージに独自のイメージソースがあるため、このオーバーヘッドは発生しません。

使い終わったら、ImagesなどのグラフィカルオブジェクトをDispose()-methodで常に破棄する必要があることに注意してください。これにより、アプリケーションが少し高速化され、一般的なメモリ使用量が削減されます。

于 2010-09-23T13:17:50.630 に答える