Докато сравнявах приложение на Clojure и се опитвах да установя проблеми с производителността, забелязах това странно поведение: дори когато цялата програма е написана на Java, когато се стартира от Leiningen, изглежда, че изпитва значително забавяне.
Да кажем, че имам тази 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
) от около 1s. Въпреки това, когато го стартирам от leiningen така:
lein run -m Foo
Получавам време за работа от около 2s! Как Clojure/Leiningen успява да забави толкова много цяла Java програма? какво правя грешно
Опитах се да прегледам свойствата на системата и в двете изпълнения и не можах да намеря нищо впечатляващо (като различни JIT настройки). И в двата случая използвам Java 7 със сървърния компилатор.
РЕДАКТИРАНЕ: Не знам защо този въпрос е гласуван против. Не съм против Clojure. Напротив, обичам Clojure и ще го използвам. Просто имам този сериозен проблем с производителността, който абсолютно трябва да разреша.
АКТУАЛИЗАЦИЯ: Изпълнението на lein trampoline
решава проблема! (макар че нямам представа защо) Актуализирах въпроса, за да отрази, че това наистина е проблем на Leiningen, а не на Clojure.
Друга актуализация: Това се случва и за всеки код на Clojure. Бягането без батут забавя кода с до 5 пъти.
lein help trampoline
- person noahlz   schedule 28.04.2013