Scala perf: Почему это приложение Scala в 30 раз медленнее, чем эквивалентное приложение Java?

Я очень опытный разработчик C#, но мне нужно начать писать код, работающий на JVM. В наши дни язык Java беден по сравнению с C#, поэтому меня интересовали возможности, которые предлагает Scala.

Однако, когда я услышал, что в Scala все операторы являются просто методами, я заподозрил влияние на производительность математических вычислений (что важно для типов приложений, которые пишет моя команда).

Поэтому я провел несколько простых тестов на основе int и обнаружил, что Scala примерно в 30 раз медленнее, чем эквивалентный код Java. Фигово! Может ли кто-нибудь сказать мне, что я делаю неправильно? или как улучшить вычислительную производительность примера scala, чтобы она была на одном уровне с Java?

UPDATE1: как указано в первых двух ответах, я был супер-нубом и запускал это в IntelliJ IDE. Я не знаю, как запустить приложение scala через командную строку java, что может быть проблемой IntelliJ. Спасибо за помощь, ребята, мне нужно исследовать простое выполнение scala из командной строки, прежде чем я продолжу тестирование производительности, поскольку результаты, полученные в IDE, очевидно, слишком неточны.

ОБНОВЛЕНИЕ 2: Луиджи в комментариях говорит, что в IntelliJ он получает одинаковое время, поэтому кажется, что моя дикая разница не из-за IntelliJ? Любые другие идеи о том, что это может быть? Я попробую запустить это через командную строку и опубликую обновление с моими результатами.

ОБНОВЛЕНИЕ3: после запуска этого через командную строку я получаю ту же 30-кратную разницу в производительности.
Мой компьютер представляет собой 3-ядерный AMD x64 3,4 ГГц, работающий под управлением J2SE 6 jdk 64bit 1.6.0_31, Window7.

Вот моя среда выполнения: Java: 210 мс.
Scala: между 2000 и 7400 мс (обычно диапазон 7000)

, так что, я полагаю, вопрос все еще открыт. почему scala работает так медленно на моей платформе? что-то с 64-битной средой выполнения Java или с Java 6?

версии среды выполнения:

C:\Users\jason>java -showversion
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b05)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)

C:\Users\jason>scala
Welcome to Scala version 2.9.1-1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_31).

ОБНОВЛЕНИЕ 4, в то время как мой первоначальный тест имеет 30-кратную разницу, увеличение числа итераций до 100000000 приводит к тому, что разница сокращается примерно до 33%, поэтому кажется, что в scala по-прежнему доминирует какая-то неизвестная стоимость инициализации на моем машина. я закрою это ответом с наивысшим рейтингом, так как я не думаю, что мы обнаружим проблему с производительностью, потому что никто, кроме меня, не видит проблему :(

* ОБНОВЛЕНИЕ 5, РЕШЕНИЕ: на основе помощь из 2 ответов, которые я получил, я понял проблему, см. мой ответ ниже для более подробной информации (резюме: первый вызов System.nanoTime() занимает много времени) *

Вот мои примеры приложений:

//scala
object HelloWorld {
  //extends Application {
  def main(args: Array[String]) {
    println("hello scala")
    var total: Long = 0
    var i: Long = 0
    var x: Long=0;
    //warm up of the JVM to avoid timing of runtime initialization
    while (i < 100000)
    {
      x=i;
      x += x - 1;
      x -= x + 1;
      x += 1;
      x -= 1;
      total += x;
      i+=1;
    }
    //reset variables
    total = 0
    i = 0;
    //start timing
    var start: Long = System.nanoTime

    //run test
    while (i < 100000) {
      x=i;
      x += x - 1;
      x -= x + 1;
      x += 1;
      x -= 1;

      total += x;
      i+=1;
    }
    var end: Long = System.nanoTime
    System.out.println("ms, checksum = ")
    System.out.println((end - start) / 1000)
    System.out.println(total)
  }
}

, а вот эквивалент Java, в 30 раз быстрее

//java
public class app {
    public static void main(String[] args)
    {
        String message = "hello, java";
        System.out.println(message);
        long total = 0;
        //warm up of the JVM to avoid timing of runtime initialization
        for(long i=0;i< 100000;i++)
        {
            long x=i;
            x+=x-1;
            x-=x+1;
            x++;
            x--;
            total+=x;
        }
        //reset variables
        total = 0;
        //start timing and run test
        long start = System.nanoTime();
        for(long i=0;i< 100000;i++)
        {
            long x=i;
            x+=x-1;
            x-=x+1;
            x++;
            x--;
            total+=x;
        }
        long end = System.nanoTime();
        System.out.println("ms, checksum = ");
        System.out.println((end-start)/1000);
        System.out.println(total);
    }
}
14
задан Thorbjørn Ravn Andersen 3 August 2013 в 14:15
поделиться