Я очень опытный разработчик 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 по-прежнему доминирует какая-то неизвестная стоимость инициализации на моем машина. я закрою это ответом с наивысшим рейтингом, так как я не думаю, что мы обнаружим проблему с производительностью, потому что никто, кроме меня, не видит проблему :(
Вот мои примеры приложений:
//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);
}
}