none
請問迴圈中使用之變數宜宣告於何處? RRS feed

  • 問題

  • 請問假設在迴圈中使用到字串的變數,宣告的位置應該在迴圈外,或是在迴圈中會比較好呢?

    考慮的因素又是什麼?希望能夠給予指教,謝謝。

     

    case A:

    string strTemp="";

    for(int i=0;i<10;i++)

    {

        strTemp="a";

    }

     

    case B:

    for(int i=0;i<10;i++)

    {

        string strTemp="a";

    }

    2008年7月22日 上午 06:43

解答

  • 低手的回答...

     

    個人認知, 以程式的可讀性, 維護性與一致行. 建議採外圍方式.

    string strTemp="";

    case A:

    for(int i=0;i<10;i++)

    {

        strTemp="a";

    }

     

    若以效能而言, 採圈內方式. (但基本上快沒多少...)

    for(int i=0;i<10;i++)

    {

        string strTemp="a";

    }

     

    您所舉的例子strTemp我換成是物件TestClass

    Code Snippet

    void Compare()

    {

                TestClass tc = null;
                string r1 = "", r2 = "";
                DateTime st = DateTime.Now;

                for (int i = 0; i <= 100000000; i++)
                {
                    tc = new TestClass();
                    tc.Val = i.ToString();
                }

                r1=((TimeSpan)DateTime.Now.Subtract(st)).TotalMilliseconds.ToString();

                st = DateTime.Now;
                for (int i = 0; i <= 100000000; i++)
                {
                    TestClass tc2 = new TestClass();
                    tc2.Val = i.ToString();
                }
                r2 = ((TimeSpan)DateTime.Now.Subtract(st)).TotalMilliseconds.ToString();
                Console.WriteLine(string.Format("{0}\t{1}",r1,r2));

    }

     

        public class TestClass
        {
            private string m_val = "";
            public TestClass()
            {
                m_val = "zzz";
            }
            public string Val
            {
                get { return this.m_val; }
                set { this.m_val = value; }
            }
        }

     

     

    在我的電腦上跑出來的結果

    使用外圈44539(TimeSpane.TotalMilliseconds)

    使用內圈44187(TimeSpane.TotalMilliseconds)

    .

    原我以為使用外圈比較快. 但結果是內圈比較快.

    推論可能原因: 假如你在一張A4畫東西, 畫錯了. 要重畫

    1. 你要擦掉重畫比較快 <-外圈

    2. 還是拿一張新A4來比較快 <-內圈, 當然是拿新的來比較快 ^^y

    (那畫壞掉的怎麼辦? 丟給碎紙機(GC)去處理.... (音效)魯斯斯.......)

     

     

     

     

    • 已標示為解答 tchsuaskl 2009年11月24日 上午 01:05
    2008年7月22日 上午 07:23

所有回覆

  • 低手的回答...

     

    個人認知, 以程式的可讀性, 維護性與一致行. 建議採外圍方式.

    string strTemp="";

    case A:

    for(int i=0;i<10;i++)

    {

        strTemp="a";

    }

     

    若以效能而言, 採圈內方式. (但基本上快沒多少...)

    for(int i=0;i<10;i++)

    {

        string strTemp="a";

    }

     

    您所舉的例子strTemp我換成是物件TestClass

    Code Snippet

    void Compare()

    {

                TestClass tc = null;
                string r1 = "", r2 = "";
                DateTime st = DateTime.Now;

                for (int i = 0; i <= 100000000; i++)
                {
                    tc = new TestClass();
                    tc.Val = i.ToString();
                }

                r1=((TimeSpan)DateTime.Now.Subtract(st)).TotalMilliseconds.ToString();

                st = DateTime.Now;
                for (int i = 0; i <= 100000000; i++)
                {
                    TestClass tc2 = new TestClass();
                    tc2.Val = i.ToString();
                }
                r2 = ((TimeSpan)DateTime.Now.Subtract(st)).TotalMilliseconds.ToString();
                Console.WriteLine(string.Format("{0}\t{1}",r1,r2));

    }

     

        public class TestClass
        {
            private string m_val = "";
            public TestClass()
            {
                m_val = "zzz";
            }
            public string Val
            {
                get { return this.m_val; }
                set { this.m_val = value; }
            }
        }

     

     

    在我的電腦上跑出來的結果

    使用外圈44539(TimeSpane.TotalMilliseconds)

    使用內圈44187(TimeSpane.TotalMilliseconds)

    .

    原我以為使用外圈比較快. 但結果是內圈比較快.

    推論可能原因: 假如你在一張A4畫東西, 畫錯了. 要重畫

    1. 你要擦掉重畫比較快 <-外圈

    2. 還是拿一張新A4來比較快 <-內圈, 當然是拿新的來比較快 ^^y

    (那畫壞掉的怎麼辦? 丟給碎紙機(GC)去處理.... (音效)魯斯斯.......)

     

     

     

     

    • 已標示為解答 tchsuaskl 2009年11月24日 上午 01:05
    2008年7月22日 上午 07:23
  • 經驗無價,你真的太厲害了,這種問題你都有辦法回!

    我真的不知他這題用到變數有何意意?

    我認為你要放哪裡要看你全體的語意而定.

    你哪時做全域變數的比較?

    string 是很特別的型別,介於 Reference Type 跟 Value Type 的特性,反正我不知如何形容他的特性,But 如果這個string 的 valable 變化很大的話效能是會降低的,所以如字串變動或由字串去組Sql Command...建議用StringBuilder 去組.

     

    2008年7月22日 上午 08:08
  • 因我從他的語意裡面推測, 應該不是要使用在串組字串的應用.

    要不在case B內, strTemp 被重新宣告, 之前的若有暫存字串也就沒有意義, 也就沒有辦法去串組字串.

    (除非真的被你猜中, 哈.)

    又標題以"請問迴圈中使用之變數宜宣告於何處?"

    ==============================

    另一方面, 他的問題, 也引發我的好奇, 在.net的編譯器內, 會如何編譯或處理這樣的動作.

    原我在想宣告在外圈會比較快的原因.

    在於, 於最上方時一旦經過宣告某變數後, 理應其起始的記憶體位置將被固定.

    爾後的應用, 應該是速度比較快的去找到它而去使用它.

    在圈內每次宣告新變數, 有可能每次宣告所得到的記憶體位置可能不同, 進而可能在存取速度上可能會有影響.

     

    然而, 經測試後事實並非如此...

     

    (主要也是我的好奇, 來加以驗證, 是不是有達到po版人之意, 到也就其次了. 數據只是提供參考.)

    ==============================

    因此, 我才回版.

     

    謝謝你的指教. 好說.

    2008年7月22日 上午 08:41