多次执行jar文件并分析输出

时间:2009-11-21 11:22:39

标签: java performance

我想测试问题中java中两个实现中哪一个是最快的。 我有两个jar文件,我可以从终端执行这两个实现。我想要执行大约100次,并分析哪一个是最快做那个或那个任务。 在输出中,其中一行是“执行时间:xx”,我需要捕获这个xx以放入一个数组或类似的东西以便稍后进行分析

当我正在执行jar时,我还要提供一些输入命令(比如搜索名称或数字)。

我最简单的做法是哪种语言。 我知道Bash和Python的基础

谢谢

3 个答案:

答案 0 :(得分: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();
    }
}

并为第二个罐子做同样的事。

我希望我的想法可以帮到你。

再见

答案 1 :(得分:0)

如果您使用(比方说)Perl,您可以关闭该过程,通过重定向捕获输出并过滤时间。 e.g。

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

(未编译或测试!)

分析数据的最简单方法可能是将上述输出重定向到文件,然后将其加载到Excel中。然后,您可以使用Excel计算平均值/最大/分钟和标准。开发人员(如果你愿意的话)很容易。

答案 2 :(得分: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();
}

运行500倍两种算法的bash代码

#!/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()

它有效 但感谢您的主张