2013-03-30 87 views
-2

可以創建一個程序,使用字節代碼,像平常一樣運行程序,通過使用每條指令的定義運行時間來保持總運行時間的計數走?然後,一旦你的程序完成了,你將擁有一個精確的,與系統無關的運行時間值,而不需要反覆運行你的程序並對結果取平均值,或者找到最小值。當然,實際運行時間與實際運行時間之間的關係根據變量的過量而不同,但似乎這樣一個數字至少可以選擇使用。計算確切的運行時間,而不是實際的運行時間

因此,爲了清楚,還有這裏的三個問題(不好意思,但是這只是防止跟進簡潔的問題),建立在對方:

  1. 是否有可能,或者是有一個理論結果阻止這個(停止問題或某事)?

  2. 如果可能的話,爲什麼從未使用過?這似乎很有價值,因爲許多實際原因

  3. 還是有一個存在,我只是想念它嗎?

+2

http://stackoverflow.com/questions/how-to-ask這個問題太開放了。 – OldProgrammer

+1

你的建議可能不切實際。影響現代系統上一段代碼執行時間的變量的數量是軍團。即使空氣溫度和溼度也會影響執行時間。 – Taylor

+0

你最好的選擇可能是一個有櫃檯的虛擬機器。儘管如此,這是一個不尋常的優化水平。通常你可以對這個級別的代碼進行理論化。 – Dave

回答

0

基本的問題是每個指令或方法或執行的任何操作的次數不是任何事情的可靠預測器,除了需要多長時間才能在同一個輸入上再次運行相同的程序。

爲了得到一個有用的預測指標,您需要一個很好的模型來說明程序的執行時間取決於其輸入。自動生成這樣一個模型並不是一個容易處理的問題。

  • 停機定理說,你不能確定先驗任何程序是否會設定一個給定的輸入停止。

  • 實際上,定理證明技術不能勝任除了非常簡單的程序之外的任何任務。

  • 試圖獲取的經驗方法模型(試圖通過曲線擬合實驗結果IE)是行不通的,因爲:

    • 這是不可能的(自動)工作出了什麼鍵變量是針對模型的。事實上,這些變量甚至可能不是數字。
    • 即使您管理了這一點,您現在也可以知道程序的性能是否符合任何精度的經典曲線。你可能會得到一個模型,但你知道如何準確的方式。

只是爲了說明這一點,考慮保理了大量的問題。如果這個數字有小因素,那麼計算時間會很快。如果沒有的話......好吧根據維基百科,最好的方法的分解整數最壞的情況下計算的複雜性是:

O(exp(((64b/9)^(1/2).(log b)^(2/3))) 

其中b是在數位的數量。這對於b的大值是難以處理的。

所以......

  • 一個分析解決方案,它可以給我們一個有用的預測就相當於找到一個快速分析的解決方案,說一個數是不是(絕對)因式分解和因素如何大是。這是一個數學上有挑戰性的問題。

  • 一個經驗的解決方案不能存在,因爲沒有有用的經驗模型存在......不涉及首先做分解。

+0

沒錯,唯一一次計時代碼真的很有價值的是,當你在大量的隨機輸入上進行測試時,這種方法和普通計時一樣不精確,所以它沒有太大的好處。這是一個無賴,但有道理,謝謝! – Xilo27

+0

我瞭解你已經添加的其他部分,這不是我所要求的 - 但無論如何,謝謝你,涵蓋所有的替代選項(這是不可行)好。 – Xilo27

0

Java實現:

int start = System.currentTimeMillis(); 

//Code to be timed... 

int end = System.currentTimeMillis(); 
System.out.println(end - start); 
+0

當然可以,但那不是我說的。這種方法是不準確的 - 要得到一個接近你的代碼的確切時間的數字,你必須反覆運行它,然後對結果進行平均(這是一個痛苦)。相反,因爲我們真的不在乎需要多長時間,只是相對的時間,我們是否可以抽象出一些東西並計算上面描述的內容呢? – Xilo27

+0

公平地說,當然有時候時間很重要。但其他時候,我們只是將一種算法與另一種算法進行比較,並且在這種情況下,相對的精確結果會更加有用且可靠。 – Xilo27

+0

@ Xilo27接近你要找的東西,不要平均,取最小值。 「真實」的運行時間總是比任何時候都少。如果你的腳本足夠小,真正的運行時甚至可能是你觀察的最短時間(如果你對系統調用感到非常幸運)。對於現實世界,是的,平均值。 – Dave

0

如果您運行在同一臺機器上的所有程序和使用工藝在時間不是真正的運行時間的結果應該是很accurrate。看看.Net框架中的類Proccess,以便於理解(它包含的屬性可以爲您提供UserTime和Proccess本身的KernelTime),這個類也是OS proccess API的一個很好的包裝。 另一種分析算法執行或完整性的方式由O符號給出,它需要對代碼進行深入分析,其中的問題是每個操作不要花費相同的時間,所有這些理論都適用於理想的機器。 Maibe爲了做這樣的事情,你需要所有你想要支持的語言的解釋器,並使所有這些將變得極其複雜。

+0

不錯,謝謝,這是一個開始,但這裏的問題仍然是,對於大多數計算機,操作系統會導致您一次在處理器(鼠標桌面等)以及程序上運行多個程序。這些不可避免地導致時間不準確,其中許多不準確。此外,像自動垃圾收集這類與算法運行時間無關的事情本身會導致更多的不準確,從而導致精確比較。 – Xilo27

+0

檢查Proccess類(我之前提到的2個屬性)它會給你真實的處理時間,而不是你以人的身份進行處理的時間,它會給你處理proccesor的時間。 – Asav

+0

啊,我看到了,對不起,我誤解了你,Proccess是你運行的特定程序,而不是處理器本身。在這種情況下,這看起來很神奇 - 爲什麼我們通常不使用這個代替millis等等來計時代碼呢?你知道如果有一個相當於Java的? (Java Process類似乎沒有類似的功能) – Xilo27