8

.Net CLR GCで紹介プレゼンテーションを行っており、さまざまな要素がすべて揃っていますが、収集を強制しようとすると危険または有害になる可能性があることを具体的に示す例が必要でした。私はあなたが時期尚早に物事をより高い世代に強制することができることを知っています、しかし(私が言うことができることから)それは本当に物事を遅くするだけでしょう。

私は、GCを強制することが本当に損害を与える可能性がある状況を考えようとしており、単に効率の悪いソリューションを考え続けています。

4

2 に答える 2

4

これが興味深いデモンストレーションです。リリースモードでコンパイルされたこのデモを実行する必要があることに注意してください。そうしないと、宣伝どおりに機能しない可能性があります。

バージョン1:

private void Button_Click(object sender, EventArgs e)
{
    Timer timer = new Timer(Print, null, 0, 1000);
}

private void Print(Object o)
{
    if (textBox1.InvokeRequired)
    {
        Action<object> action = Print;
        textBox1.Invoke(action, o);
        return;
    }

    textBox1.Text = DateTime.Now.ToString();
}

バージョン1は、日付と時刻を1秒に1回テキストボックスに印刷します。

バージョン2:

private void Button_Click(object sender, EventArgs e)
{
    Timer timer = new Timer(Print, null, 0, 1000);
}

private void Print(Object o)
{
    if (textBox1.InvokeRequired)
    {
        Action<object> action = Print;
        textBox1.Invoke(action, o);
        return;
    }

    textBox1.Text = DateTime.Now.ToString();

    GC.Collect(); // force a garbage collection
}

バージョン2では、宣言後、タイマーオブジェクトへの参照がなくなり、タイマーオブジェクトが収集されるため、日付と時刻は1回だけ出力されます。

これはかなり不自然な例ですが、良いデモンストレーションになるかもしれません。

私はこれについてジェフリー・リヒターの功績を認めなければなりません-それは彼の優れた本にありCLR via C#ます。

于 2012-07-23T20:28:27.337 に答える
1

次の悪い考えはどうですか?「確実に孤立する要求の状態をクリーンアップするために、ASP.NETですべてのHTTP要求の後にGCを強制しましょう!」

同時HTTPリクエストは互いに干渉するため、これは悪い考えです。これにより、多くの遅延スパイクが発生し、パフォーマンスが低下します。それはすべて、無実の「最適化」から始まります。

それは私が考えることができる最悪のことです。

于 2012-07-23T19:59:09.763 に答える