Это должно поднять красные флажки для вас, если, как упоминалось ранее, версия с вложенным циклом Java, которая появляется из исходного кода и требует в 10 000 раз больше времени, чем не вложенный цикл, только в 3 раза больше времени. (~ 3 мс для вложенного цикла Java, против ~ 1 мс для не вложенного цикла). Я не знаю, почему это происходит, но есть несколько вариантов:
(a) JITM-компиляция JVM еще не запущена для вашей более короткой версии, так что все или большая часть временипотратил на интерпретацию байтового кода или выполнение менее оптимизированной версии машинного кода JIT по сравнению с версией вложенного цикла
(b) JIT JVM каким-то образом определяет, что ваши циклы не нужно запускать, потому чтоне возвращает значение, поэтому тот же эффект происходит независимо от того, запущены циклы или нет. В целом, я бы порекомендовал выполнить хотя бы немного вычислений в каждом внутреннем цикле (например, добавить два числа, например, к промежуточному итогу), и иметь возвращаемое значение, которое зависит от того, что происходит это вычисление.
Iздесь были созданы версии Clojure и Java с аналогичным временем выполнения, которые вы можете посмотреть, и записаны результаты измерений, которые я получил, используя библиотеку Criterium , которая много раз запускает один и тот же код, чтобы "прогреть"Сначала JIT, а затем измеряет его много раз после этого, сообщая о результатах только на основе выполнений после прогрева.
Java-код: https://github.com/jafingerhut/leeuwenhoek/blob/master/src/leeuwenhoek/java/JavaLoops.java
Код Clojure: https://github.com/jafingerhut/leeuwenhoek/blob/master/src/leeuwenhoek/clojure_loops.clj
Код измерения для обоих, с результатами в комментариях: https://github.com/jafingerhut/leeuwenhoek/blob/master/src/leeuwenhoek/measure_loops.clj