Я очень опытный разработчик C #, но мне нужно начать писать код, который работает на JVM.Язык Java по сравнению с C # в настоящее время плохо работает, поэтому меня интересовали функции, которые предлагает Scala.
Однако, услышав, что в Scala все операторы являются просто методами, я стал подозревать, что производительность может повлиять на сложные математические вычисления (что важно для типов приложений, которые пишет моя команда)
Итак, я запустил несколько простых тестов на основе int и обнаружил, что Scala примерно в 30 раз медленнее, чем эквивалентный код Java.Нехорошо!Может кто-нибудь сказать мне, что я делаю не так?или как улучшить вычислительную производительность примера scala, чтобы он соответствовал Java?
UPDATE1: как указывалось в первых двух ответах, я был супер-нубом и выполнял это в IntelliJ IDE.Я не знаю, как запустить приложение Scala через командную строку Java, что может быть проблемой IntelliJ.Спасибо за помощь, ребята, мне нужно исследовать простое выполнение scala из командной строки, прежде чем я продолжу тестирование perf, поскольку приведенные результаты IDE явно слишком неточны.
ОБНОВЛЕНИЕ2: Луиджи в комментариях говорит в IntelliJ, что онполучает равные времена, так что кажется, что моя дикая разница не из-за IntelliJ?Любые другие идеи о том, что это может быть?Я попробую запустить его через командную строку и выложу обновление с моими результатами.
ОБНОВЛЕНИЕ3: после запуска через командную строку я получаю такую же 30-кратную разницу в производительности.
Мой компьютер - 3-ядерный AMD x64 3,4 ГГц, работает J2SE 6 jdk 64-битная 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, РЕШЕНИЕ: на основе справки из двух ответов, которые я получил, я выяснил проблему, см. мой ответ ниже для получения более подробной информации (краткое описание: первый вызов 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);
}
}