3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(.Net)コントロールのプロパティアクセスは遅い!?

.Netではコントロールの表示だけでなく、プロパティアクセスも遅いということに最近気づきました。

下記のコードを実行して、ループ内からTextBoxのTextプロパティにアクセスしたのと、一旦、ローカル変数にTextプロパティの値を移しておきそれを参照した場合とを比較してました。
(ループ回数は100万回です。CPUはCore2Duo T8300 2.4GHz )

■ループ内からTextBoxのTextプロパティにアクセスしたコード

    /// <summary>
    /// TextBoxコントロールのTextプロパティをループの中で取得
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button1_Click(object sender, EventArgs e)
    {
        TimeSpan tm = new TimeSpan();
        string strTmp = "";
        int ln = 0;
        for (int i = 0; i < 1000000; i++)
        {
            DateTime dtSt = DateTime.Now;
            //コントロールのTextプロパティから直接取得
            strTmp = this.textBox1.Text;
            ln += strTmp.Length;
             DateTime dtEnd = DateTime.Now;
            tm += (dtEnd - dtSt);
        }
        Console.WriteLine("速度:  " + tm.ToString());
    }

結果「速度:  00:00:20.6780000」



■一旦ローカル変数にTextプロパティの値を移しておき,それを参照した場合

    /// <summary>
    /// TextBoxコントロールのTextプロパティはループより前にローカル変数に退避。
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button2_Click(object sender, EventArgs e)
    {
        TimeSpan tm = new TimeSpan();
        string strTmp = "";
        //コントロールのTestプロパティはいったんこの変数に退避。ループ内ではこのローカル変数にアクセス。
        string textBox1Text = this.textBox1.Text;
        int ln = 0;
        for (int i = 0; i < 1000000; i++)
        {
            DateTime dtSt = DateTime.Now;
            //ローカル変数に退避した値を使用。
            strTmp = textBox1Text;
            ln += strTmp.Length;
             DateTime dtEnd = DateTime.Now;
            tm += (dtEnd - dtSt);
        }
        Console.WriteLine("速度:  " + tm.ToString());
    }

結果「速度:  00:00:00.2910000」

結果は20秒と0.3秒という大差となりました。
Textプロパティでの取得処理が内部的にどうなってるから遅いというは時間なくて調べてませんが、ループ回数が多い時にプロパティから取得するのは注意しましょう。