При тестировании приложения Clojure и попытке определить проблемы с производительностью я заметил это странное поведение: даже когда вся программа написана на Java, при запуске из Лейнингена она, кажется, испытывает значительное замедление.
Скажем, у меня есть эта программа Java:
public class Foo {
public static void main(String[] args) throws Exception {
for (int i = 0; i < 10; i++)
run();
}
public static void run() {
final long start = System.nanoTime();
Random r = new Random();
double x = 0;
for(int i=0; i<50000000; i++)
x += r.nextDouble();
final long time = TimeUnit.MILLISECONDS.convert(System.nanoTime() - start, TimeUnit.NANOSECONDS);
System.out.println("time (ms): " + time + " total: " + x);
}
}
Когда я просто запускаю программу, я получаю время выполнения (на run
) около 1 с. Однако, когда я запускаю его из лейнингена, вот так:
lein run -m Foo
Я получаю время работы около 2 с! Как Clojure/Leiningen удается так сильно замедлять полную Java-программу? Что я делаю неправильно?
Я пытался изучить свойства системы в обоих прогонах и не нашел ничего особенного (например, разные настройки JIT). В обоих случаях я использую Java 7 с серверным компилятором.
РЕДАКТИРОВАТЬ: я не знаю, почему этот вопрос был отклонен. Я не против Clojure. Наоборот, я люблю Clojure и собираюсь его использовать. У меня просто есть серьезная проблема с производительностью, которую я обязательно должен решить.
ОБНОВЛЕНИЕ: Запуск lein trampoline
решает проблему! (хотя я понятия не имею, почему) я обновил вопрос, чтобы отразить, что это действительно проблема Leiningen, а не проблема Clojure.
Еще одно обновление: это происходит и с любым кодом Clojure. Бег без батута замедляет код до 5 раз.
lein help trampoline
- person noahlz   schedule 28.04.2013