Nov 28, 2007

Глупое сравнение производительности Ruby и Java

Нечего было делать среди ночи... вот чего учудил в ответ на: http://myskitch.com/yaroslavlazor/main.rb-20071127-210826.jpg Еще отличная ссылка по теме: http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=java&lang2=ruby Не удержался и решил провести еще несколько экспериментов. Прежде всего, правильнее всего будет вычислять время непосредственно в программе, для чего был добавлен соответствующий инструментальный код. Далее, мне стало интересно, как поведет себя в этой ситуации популярная библиотека "Commons Lang". Вот что получилось в результате: Пример кода 1:
 
    public static void main(String[] args) {
        final long t1 = System.currentTimeMillis();
        final int n = Integer.parseInt(args[0]);
        final StringBuilder b = new StringBuilder( n * TEXT.length());
        for (int i=0;i<n;i++) {
            b.append(TEXT);
        }
        System.out.println("Result:"+b.reverse().length());
        System.out.println("Time:"+(System.currentTimeMillis()-t1)/1000.0);
        
    }
Результат:
etf@etf-desktop:~/prog/JavaApplication1/dist$ time java -jar -Xmx512M -Xms512M JavaApplication1.jar 10000000
Result:50000000
Time:0.936

real    0m1.184s
user    0m0.844s
sys     0m0.208s
Пример кода 2:
    public static void main(String[] args) {
        final long t1 = System.currentTimeMillis();
        System.out.println("Result:"+StringUtils.reverse(StringUtils.repeat(TEXT, Integer.parseInt(args[0]))).length());
        System.out.println("Time:"+(System.currentTimeMillis()-t1)/1000.0);
        
    } 
Результат:
etf@etf-desktop:~/prog/JavaApplication1/dist$ time java -jar -Xmx512M -Xms512M JavaApplication1.jar 10000000
Result:50000000
Time:2.233

real    0m2.414s
user    0m1.888s
sys     0m0.400s
Пример кода 3 (Ruby):
  t1 = Time.now;
  puts "Result:" + ("test " * ARGV[0].to_i).reverse.length.to_s;  
  puts "Time:" + (Time.now - t1).to_s;
Результат:
etf@etf-desktop:~/prog/RubyApplication2/lib$ time ruby main.rb 10000000
Result:50000000
Time:0.734442

real    0m0.760s
user    0m0.560s
sys     0m0.196s
Итак, подведем неутешительные итоги нашего исследования:
ImplementationTimeRatio
Ruby0.7344421
Java (StringBuffer)0.9361.27
Java (StringUtils)2.2333.04
---------------- Now playing: Pink - Conversations With My 13 Year Old Self via FoxyTunes

1 comment:

Алексей said...

Нужно было StringBuilder использовать или работать только с массивом