Spoiler 경고, 이것이 Project Euler의 문제 5입니다.간단한 루프 대 Java에서 Clojure 성능이 매우 낮습니다
나는 Clojure를 배우려고하고 문제 5를 해결하려고 시도하고 있지만, Clojure의 경우 Java에서 1515ms 대 169932ms보다 느리다. 나는 타입 힌팅, 검사되지 않은 수학 연산, 그리고 아무 것도없는 모든 함수를 인라이닝하려고했습니다.
왜 Clojure 코드가 그렇게 느린 거죠?
의 Clojure 코드 :
(set! *unchecked-math* true)
(defn divides? [^long number ^long divisor] (zero? (mod number divisor)))
(defn has-all-divisors [divisors ^long num]
(if (every? (fn [i] (divides? num i)) divisors) num false))
(time (prn (some (fn [^long i] (has-all-divisors (range 2 20) i)) (iterate inc 1))))
자바 코드 :
public class Problem5 {
public static void main(String[] args) {
long start = System.currentTimeMillis();
int i = 1;
while(!hasAllDivisors(i, 2, 20)) {
i++;
}
long end = System.currentTimeMillis();
System.out.println(i);
System.out.println("Elapsed time " + (end - start));
}
public static boolean hasAllDivisors(int num, int startDivisor, int stopDivisor) {
for(int divisor=startDivisor; divisor<=stopDivisor; divisor++) {
if(!divides(num, divisor)) return false;
}
return true;
}
public static boolean divides(int num, int divisor) {
return num % divisor == 0;
}
}
Java 코드는 2-18이지만 Clojure 코드는 2-20입니다. – Ankur
죄송합니다. 해결했습니다. 실수로 코드의 잘못된 버전을 붙여 넣었지만 타이밍이 20까지 올라가는 것이 정확했습니다. – gleenn
System.currentTimeMillis()를 벤치 마크로 사용합니까? 이것은 심각하지 않습니다. http://shipilev.net/talks/devoxx-Nov2013-benchmarking.pdf – Puh