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

Nov 17, 2007

JavaFX: Связываем аттрибуты разных классов.

Одной из интересных возможностей JavaFX является связывание атрибутов. Для этого используется ключевое слово inverse. Если интерпретатор JavaFX встречает ключевое слово inverse в описании атрибута класса, он автоматически обновляет (вставка, удаление замена) соотвествующий (связанный атрибут). Рассмотрим несколько примеров. Первый взят из официального описания языка (The JavaFX Script Programming Language): class Person { attribute name: String; attribute parent: Person inverse Person.children; attribute children: Person* inverse Person.parent; function getFamilyIncome(): Number; function getNumberOfChildren(): Number; operation marry(spouse: Person); } В данном случае изменение атрибута children повлечет изменение атрибута parent соответствующего объекта. Вот как это будет выглядеть: var pp:Person = Person {name: "Parent"}; var pc1:Person = Person {name: "Child1"}; var pc2:Person = Person {name: "Child2"}; insert pc1 into pp.children; pc2.parent = pp; p("pc1 = {pc1}"); p("pc2 = {pc2}"); p("pp = {pp}"); В консоле мы получим следующее: pc1 = Person {name: 'Child1' parent: Person {name: 'Parent' parent: null children: [Person ... Person {name: 'Child2' parent: Person ... children: []}]} children: []} pc2 = Person {name: 'Child2' parent: Person {name: 'Parent' parent: null children: [Person {name: 'Child1' parent: Person ... children: []} Person ...]} children: []} pp = Person {name: 'Parent' parent: null children: [Person {name: 'Child1' parent: Person ... children: []} Person {name: 'Child2' parent: Person ... children: []}]} Как видно, добавление нового объекта pc1 в коллекцию объекта pp автоматически обновляет атрибут pc1.parent. И, соотвественно, когда мы указывает значение атрибута parent у объекта pc2 - от он автоматически добавляется в коллекцию pp.children.