none
VB.Net 頁面切換延遲問題與程式執行時間差異 RRS feed

  • 問題

  • 各位先進好

    我在WinXP下用VB2005進行程式編輯
    我建立四個Form,Form1為主頁面,裡面有一個Panel,與三個Button以及用來顯示程式執行時間的Label
    其他三個Form中分別為約100個Label、約100個PictureBox、約100個Button的控制項
    由Form1中的Button進行切換,並顯示在Panel中。
    Button1切換到Form2
    Button2切換到Form3
    Button3切換到Form4

    對每一個頁面依序切換的時間記錄了五次單位(秒)
    Button1:0.26、0.08、0.08、0.08、0.08
    Button2:1.49、0.44、0.45、0.44、0.44
    Button3:0.34、0.13、0.14、0.14、0.14

    現在遇到的問題是切換時會有物件延遲的現象,且執行程式後,第一次切換需要較多的時間。
    之後的執行時間則較短,想請教各位先進,在執行時間上為什麼會有這樣的差異?

    檔案
    2012年4月3日 上午 07:34

解答

所有回覆

  • 先說,我沒下載看程式,單純談談。

    程式是邊執行邊載入記憶體,而不是一開始就全部載入,就像物件需要經過 New 之後才能使用。

    你想想,一套 OS 有幾個 GB,有幾個人家用 PC 的 RAM 有那麼大,可以開機把全部 OS 全部載入。

    程式的"初始化"是最花費成本,因為第一次什麼都沒有。載入 RAM 之後,沒有 Disk I/O … 等成本,RAM 的速度又快,當然之後會快很多。

    再來,程式執行差異,還有"硬體",在一台 單核、雙核、四核、六核 … 會各有差異。

    結論:有時間差是很正常的事。


    blog.kkbruce.net
    Plurk
    Google+專頁

    春有百花秋有月,
    夏有涼風冬有雪,
    若無閒事在心頭,
    便是人間好時節。

    2012年4月3日 上午 08:49
  • 這麼多控制項, 慢是應該的.

    至於速度會有差異的原因其中一個應該是因為快取的緣故. 另一個應該是 CLR 本身動態連結的行為.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年4月3日 上午 08:56
    版主
  • 感謝KKBruce大大的回覆

    您提到的『程式是邊執行邊載入記憶體,而不是一開始就全部載入,就像物件需要經過 New 之後才能使用。』,這個我知道

    因為小弟初學VB.Net四個多月,沒有很熟練。

    也想請教您,在.Net中,要如何一開始就全部載入

    因為我想練習透過初始化,先把相關的頁面載入記憶體,不至於讓後續的頁面切換的時間差差那麼多。

    像一些3C產品一樣,開機的初始化需要一些時間,但是進入主畫面後的畫面切換都很順暢。

    我有Google過一些資料,但是都沒有找到,我想是我關鍵字下的不對。

    想請教我應該下什麼樣的關鍵字,才能找尋到這些關於初始化載入記憶體的相關資料?

    2012年4月5日 上午 01:48
  • 感謝Bill Chung版主的回覆

    我知道控制項多會影響到速度,因此我後來把大部分只有單純顯示的控制項都用畫的。

    可是練習一個簡單的例子時發現頁面切換上速度上還是有差,因此才提問。

    關於您提到的速度差異原因其中是因為『快取的緣故』以及『CLR 本身動態連結』

    想請教您為何在這兩項上會有這樣的差異?請您不吝指教。

    2012年4月5日 上午 02:02
  • 大內高手專欄: 程式的啟動與載入

    你先了解上文內容先。

    你想想,我假設有一小段程式:

    Dim a,b,c As Integer
    a = 1
    b = 2
    c = a + b

    假設,a, b, c 就是你的 form 1,2,3,你前面的內容 a, b 未執行完畢,你就載入 c,合理嗎?

     

    blog.kkbruce.net
    Plurk
    Google+專頁

    春有百花秋有月,
    夏有涼風冬有雪,
    若無閒事在心頭,
    便是人間好時節。

    2012年4月5日 上午 02:28
  • CLR 的, KKBruce 已經給你link了.

    快取的部份就是硬體的快取記憶體也會影響再度載入的問題.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年4月5日 上午 04:15
    版主
  • 您好,

    您可以在程式一起動時,就把form2, from3, form4先建立起來!

    而不用在button的事件中再建立! 

    另外,每次都把panel1中的control.clear後再add也會變比較慢!

    您也可以在panel1中加入3個panel (p1, p2, p3),然後在form_load時就把f1, f2, f3分別加入p1, p2, p3之中!

    在button事件,就只開關p1, p2, p3的顯示就可以了!


    以上說明若有錯誤請指教,謝謝。
    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/


    • 已編輯 亂馬客 2012年4月5日 上午 05:16
    2012年4月5日 上午 04:47