вторник, 14 февраля 2012 г.

Scala, переопределение операторов


Продолжаю изучать Скалу.
Скала, как известно, тотально обьектно ориентирована. Здесь нет ни примитивов, ни операторов в прямом смысле этого слова. Однако, это совсем не значит, что вы не можете использовать "+","-" и другие операторы в своём коде.

"+" и "-" можно определить как методы в соответствуюших классах. Например, создадим класс Num

class Num (val intgr: Int){
  def +(num: Num)= {
    new Num( intgr + num.intgr)
  }

  def -(num: Num)= {
    new Num( intgr - num.intgr)
  }

  override def toString = "Num "+ intgr
}
и запустим такой скрипт, чтобы протестировать наш код:
val num1 = new Num(10)
val num2 = new Num(5)
println ( num1 + num2 )
println ( num1 - num2 )
Как нетрудно догадаться, результаты будут 15 и 5. Очень полезная возможность, не так ли?

четверг, 9 февраля 2012 г.

Хорошо быть Java - девелопером

Особенно в штатах :)

http://www.indeed.com даёт такую информацию:
Интересный факт. Быть Ява девелопером выгоднее, чем работать с ДотНет или ПэХаПэ. И даже ИТ аналитики зарабатывают меньше... Однако!


среда, 1 февраля 2012 г.

Java vs Scala vs Groovy performance. Так кто же быстрее?

Несколько лет назад начал интересоваться альтернативными языками для JVM. Groovy даже нашёл своё применение в некоторых "живых" проектах. Однако плохая производительность сильно ограничивала использование языка в реальных приложениях.

Прошло несколько лет, появился Groovy 1.8, который, по заявлениям разработчиков, справился с проблемами производительности. Так ли это на самом деле? Чтобы ответить на этот вопрос, я написал примитивные тесты на 3-х популярных языках для JVM.

Groovy.
 static void main(args) {
    long l = System.currentTimeMillis()
    int cnt = 0;
    100000.times { i->
      //def customer = new Tester(id: i, name:"Gromit", dob:new Date())
      //String s = ("Hello ${customer.name} ${i}")
      String s = ("Hello  ${i} Groovy")
      cnt += s.length()
    }    
    println( "${System.currentTimeMillis() - l} - ${cnt}")
}
Результат - 438 миллисекунд. То же самое в Scala :
 
override def main(args: Array[String])  {
    val l = System.currentTimeMillis()
    var cnt = 0;
    for (i <- 0.until(100000)){
      val s = "Hello " + i + " Times scala"
      cnt += s.length()      
    }
    
    println((System.currentTimeMillis() - l) + " - " + cnt)
  }
187 миллисекунд, лучше более чем в 2 раза? И теперь чистая Java (версии 1.7):
 
public static void main(String [] args) {
    long l = System.currentTimeMillis();
    int len = 0;
    for(int i = 0; i < 100_000; i++){
      String s = "Hello " + i + " Java";
      len += s.length();
    }

    System.out.println( (System.currentTimeMillis() - l)+ " - " + len) ;
}
32 миллисекунды! более чем в 10 раз быстрее аналога на Groovy. Java заруливает всех своих JVM опонентов, если речь идёт о производительности.