2009-11-21 251 views
0

我想測試java中兩個實現中哪一個是最快的。 我有兩個jar文件,可以從終端執行兩個實現。我想要執行大約100次,並分析哪一個是最快的做這個或那個任務。 在輸出其中一行是「執行時間:xx」,我需要趕上這個xx放入一個數組或類似的東西,以便稍後分析它多次執行jar文件並分析輸出

當我執行jar時,也給一些輸入命令(如搜索名稱或數字)。

我不會用哪種語言做它最簡單。 我知道的Bash和Python

基礎

謝謝

回答

0

好,我有3個不同的腳本^^

在Java代碼中發現

,每個功能:

long time1 = System.currentTimeMillis(); 
// some code for function 1 
long time2 = System.currentTimeMillis(); 

try { 
    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(new File("log.txt"),true)); 
    osw.write("function1,"+(time2 - time1)+"\n"); 
    osw.close(); 
} catch (FileNotFoundException ex) { 
    ex.printStackTrace(); 
} catch (IOException ex) { 
    ex.printStackTrace(); 
} 

一個bash代碼到500次運行兩種算法

#!/bin/bash 

i=0 
while [ $i -lt 500 ] 
do 
    ./algo1.ex 
    ./algo2.ex 
    i=$(($i+1)) 
done 

一個(或實際上兩個,每個算法一個)期望代碼在執行期間執行命令

#!/usr/bin/expect -f 

spawn java -jar algo1.jar 

expect "enter your choice" {send "1\n"} 
expect "enter a name :" {send "Peju, M.\n"} 
expect "enter your choice" {send "2\n"} 
expect "enter a name :" {send "Creasy, R. J.\n"} 
expect "enter your choice" {send "0\n"} 

exit 

,因爲我不知道該怎麼做在bash,算我使用了Python代碼

#!/usr/bin/python 
# -*- coding: utf8 -*- 

import sys 

if __name__ == "__main__": 
    if sys.argv[1:]: 
     arg = sys.argv[1] 
     filin = open(arg, 'r') 

     line = filin.readline() 

     res= 0, 0, 0 
     int n = 1 
     while line !='': 
      t = line.partition(',') 

      if t[0] == "function1": 
       res = (res[0] + int(t[2]), res[1], res[2]) 
      if t[0] == "function2": 
       res = (res[0], res[1] + int(t[2]), res[2]) 
      if t[0] == "function3": 
       res = (res[0], res[1], res[2] + int(t[2])) 

      ligne = filin.readline() 
      n = n+1 
     print res 
     print (res[0]/(n/3.0), res[1]/(n/3.0), res[2]/(n/3.0)) 

     filin.close() 

而且

1

對不起,你爲什麼不要讓調用n次任意罐子罐子?

例如:

public static void main(String[] args) { 
    for(int i=0;i<1000;i++) { 
     params1 = randomNumber(); 
     params2 = randomName(); 
     ... 
     paramsN = randomTime(); 
     MYJAR1 test1 = new MYJAR1(params1,params2,...,paramsN); 
     timerStart(); 
     test1.start(); 
     timerEnd(); 
     printTimer(); 
    } 
} 

,併爲所述第二罐中的相同。

我希望我的想法可以幫助你。

再見

+0

我使用Linux,但作品 但感謝你的命題問題是我想分析的不是所有程序的執行,而是不同的部分。 哪兩個是最快的:構建數據結構,搜索元素,添加元素,刪除元素,...當我執行jar時,我必須提供一些命令來說出我想要的內容做,並在每次產生輸出。 – 2009-11-21 11:38:38

+1

以上將意味着靜態初始化程序等只會運行一次。如果它們有時間意義並且對統計數據有貢獻,那麼它們將不會是OP想要的。 – 2009-11-21 11:49:13

+0

您可以使用netbeans分析器對jar進行分析,並顯示如何花費任何一種方法。 – 2009-11-21 11:52:41

0

如果使用(比方說)Perl中,你可以生成過程中脫落,捕捉通過重定向輸出和過濾的時間。例如

if (open(PROCESS, "myproc |")) { 
    while(<PROCESS>) { 
    if (/executing time : (\d+)/) { 
     # $1 has the time now 
    } 
    } 
} 

(未編譯或測試!)

也許分析數據的最簡單的方法是重定向上述輸出到文件中,然後將其加載到Excel中。然後,您可以使用Excel來計算平均值/最大值/分鐘和標準偏差。 devs(如果你願意)平凡。

+0

我不知道Perl,但我想它可以工作。 我也可以編輯jar文件,只有時間作爲輸出。 但我仍然有問題,我該怎麼說:執行jar,發送1作爲輸入,發送「東西」作爲輸入,發送「退出」並把輸出放在一個文件中,以便稍後分析爲例(以excel爲例) – 2009-11-21 12:20:01