none
同一段程式執行時間不同的原因 RRS feed

  • 問題

  • 最近寫的程式需考量效能問題 , 所以在以下事件程序中 , 在回圈開始前以  t_s = now.Ticks 取得開始時間 , 迴圈結束後再以   

      MsgBox((Format((Now.Ticks - t_s) / 10000000, "0.000")))

    計算其秒差 , 但我發現(在Vb2008 IDE下測試)在我按第一次button時的執行時間約需0.3秒 , 但第二次以後按該button則只需0.015秒 , 兩者相差極大 , 我猜想是跟VB編譯有關 , 第一次需編譯 , 所以時間拉長了 , 第二次以後則不用再編譯 , 所以時間變短了 , 但是我把測試程式停止 , 重新執行測試 , 執行時間還是比較長(約0.3s) , 在程式未變更情況下 , 程式會被重編譯嗎? 除了編譯此可能因素之外 , 是否有其他可能原因?在此請教眾高手!

     

     

    Private Sub Button2_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

            Dim cc, kk As Integer
            kk = 0
            Dim t_s As Long = Now.Ticks

            For cc = 0 To 999

                If InStr(arr(cc).path, "4076") > 0 And InStr(arr(cc).path, "9783") > 0 And InStr(arr(cc).path, "6470") > 0 _

                                        And InStr(arr(cc).path, "9783") > 0 And InStr(arr(cc).path, "5127") > 0 _

                                       And InStr(arr(cc).path, "2223") > 0 And InStr(arr(cc).path, "8684") > 0  _

                                        And InStr(arr(cc).path, "4431") > 0 Then

                                      kk += 1

                End If


            Next
            MsgBox((Format((Now.Ticks - t_s) / 10000000, "0.000")))
            MsgBox(kk)

     

            'TextBox1.Text = str

            'Clipboard.SetText(str)

        End Sub

    2011年4月30日 上午 03:48

解答

  • 您這個問題應該和編譯無關, 因為程式碼未修改是不需要編譯的, 您所看到的效率差別可能和arr(cc).path這個東西有關, 可能是arr(cc).path在第一次執行之後被Cache在記憶體中, 所以第二次執行較快
    2011年4月30日 上午 05:59
  • 請改用 CPU Time 量測。

    除了執行時 CPU 的利用率外,另外請把時間列出,小於 10 ms 內的誤差對 Windows 沒意義,Windows 預設精度只到 10ms ,要更高的精度要主機板支援,最多也不過是 1ms 而已。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年4月30日 上午 07:55

所有回覆

  • 您這個問題應該和編譯無關, 因為程式碼未修改是不需要編譯的, 您所看到的效率差別可能和arr(cc).path這個東西有關, 可能是arr(cc).path在第一次執行之後被Cache在記憶體中, 所以第二次執行較快
    2011年4月30日 上午 05:59
  • 請改用 CPU Time 量測。

    除了執行時 CPU 的利用率外,另外請把時間列出,小於 10 ms 內的誤差對 Windows 沒意義,Windows 預設精度只到 10ms ,要更高的精度要主機板支援,最多也不過是 1ms 而已。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    提問時,錯誤情境描述與錯誤訊息很重要,情境描述包含你做了什麼,預期的結果與實際發生的結果。一個最爛的問法範例:「我的電腦電腦怎麼不能開機?」誰知道你家是不是沒電還是你根本找不到電源鈕。
    2011年4月30日 上午 07:55
  • arr是一個自訂型別的list , 所以已經在memory中了 , 但我覺得您提到的cache記憶體是很可能的因素 , 您指的應該是指CPU中的快取記憶體吧 , 我稍微做了一下實驗 , 我在原回圈下再跑一次 , 但arr索引範圍超過第一次回圈的範圍 , 執行時間就跟第一次差不多 , 不會再明顯縮短了 , 所以您指出的cache memory是很可能的原因.謝謝您的回覆!
    2011年4月30日 下午 01:23