none
程式之美P.224的GC研究 RRS feed

  • 一般討論

  • 引用程式之美P.224的片段
    -----------------------
    在「控制CPU使用率」這道題目中,有一個應聘者的C#程式碼從邏輯上看都沒有任何問題,但是在執行中,CPU的使用率就是不平滑,會突然產生巨大的波動,然後回歸正常。反覆研究之後,發現問題原來出自--

    TimeSpan ts = new TimeSpan();

    這道敘述沒有錯,但是他把這道敘述放在一個迴圈裡面,這樣在很短的時間內,程式就建立了大量的 TimeSpan 物件。程式設計師不管記憶體釋放,但是 CLR 要管,所以 CLR 就要經常進行垃圾清理(GC)工作,導致 CPU 的使用率急遽上升。這些 details(細節)處理不好,你的程式就會出現讓你不解的奇怪行為。
    -----------------------



    很明顯的TimeSpan是值型別(struct, value type),呼叫new建構式也只是return by value,沒道理會建立大量的TimeSpan物件。
    我也透過Reflactor檢視TimeSpan所有的建構式,沒有一個會建立額外的class物件,沒道理GC會有所動作。


    另一個無關緊要的問題
    第二段第一句說了"這道敘述沒有錯",可是TimeSpan沒有0個參數的建構式。
    C#學習者,修練中,ACM解題魂 - http://kgame-blog.spaces.live.com/
    2009年7月15日 下午 01:15

所有回覆

  • 這個是對岸的人寫的書...

    沒看不知道原先書上打算寫啥。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年7月15日 下午 01:40
  • 結構有一個特異情況(也不算特異),就是會有預設建構式,即無參數型建構式,你可以自己寫支小程式,就寫 TimeSpan ts = new TimeSpan(,然後看 Visual Studio 提示的是什麼...


    小人物一枚。
    2009年7月16日 上午 11:21
    版主
  • 引用程式之美P.224的片段
    -----------------------
    在「控制CPU使用率」這道題目中,有一個應聘者的C#程式碼從邏輯上看都沒有任何問題,但是在執行中,CPU的使用率就是不平滑,會突然產生巨大的波動,然後回歸正常。反覆研究之後,發現問題原來出自--

    TimeSpan ts = new TimeSpan();

    這道敘述沒有錯,但是他把這道敘述放在一個迴圈裡面,這樣在很短的時間內,程式就建立了大量的 TimeSpan 物件。程式設計師不管記憶體釋放,但是 CLR 要管,所以 CLR 就要經常進行垃圾清理(GC)工作,導致 CPU 的使用率急遽上升。這些 details(細節)處理不好,你的程式就會出現讓你不解的奇怪行為。
    -----------------------



    很明顯的TimeSpan是值型別(struct, value type),呼叫new建構式也只是return by value,沒道理會建立大量的TimeSpan物件。
    我也透過Reflactor檢視TimeSpan所有的建構式,沒有一個會建立額外的class物件,沒道理GC會有所動作。


    另一個無關緊要的問題
    第二段第一句說了"這道敘述沒有錯",可是TimeSpan沒有0個參數的建構式。
    C#學習者,修練中,ACM解題魂 - http://kgame-blog.spaces.live.com/
    不管如何,我將這個問題傳給原作者了,看看他有沒有空蒞臨指導囉 :)

    MSDN首頁 : http://msdn.microsoft.com MSDN Taiwan Twitter : http://twitter.com/msdn_taiwan
    2009年7月16日 下午 12:01
  • 結構有一個特異情況(也不算特異),就是會有預設建構式,即無參數型建構式,你可以自己寫支小程式,就寫 TimeSpan ts = new TimeSpan(,然後看 Visual Studio 提示的是什麼...


    感謝說明

    我居然突然忘記struct預設就有無參數型建構式,而且還不准自己寫這個的主體。
    C#學習者,修練中,ACM解題魂 - http://kgame-blog.spaces.live.com/
    2009年7月16日 下午 12:20