对于真正熟悉 Clojure 的人来说,这将是一个问题。
我想用 Java 和 Clojure 编写简单的素数检查函数,并比较执行时间。
所以这是我的Java代码:
import java.util.LinkedList;
public class Primes {
public static void main(String args[])
{
long start = System.nanoTime();
getPrimes(10000);
long end = System.nanoTime();
System.out.println(((float)(end - start)/1000000) + "ms");
}
private static LinkedList<Integer> getPrimes(int n)
{
int count = 0;
int current = 1;
LinkedList<Integer> primes = new LinkedList<Integer>();
while(count <= n)
{
if(isPrime(current))
{
primes.add(current);
count++;
}
current++;
}
return primes;
}
private static boolean isPrime(long n)
{
if(n <= 0) return false;
if(n == 1 || n == 2) return true;
if(n % 2 == 0) return false;
for(int i=3; i<Math.sqrt(n) + 1; i=i+2)
{
if(n % i == 0){
return false;
}
}
return true;
}
}
这是 Clojure 等价物:
(defn prime? [n]
(or (= n 2) (not (some #(zero? (rem n %)) (conj (range 3 (inc (Math/sqrt n)) 2) 2)))))
(defn printPrimes [n] (take n (filter prime? (iterate inc 1))))
(defn ExecTime [function & arguments] (let [start (System/nanoTime), return (dorun (apply function arguments)), end (System/nanoTime)] (/ (- end start) 1000000.0)))
(ExecTime printPrimes 10000)
现在有几件事我不确定:
- (let) 和绑定开始和结束时间是否可以测量 Clojure 中的执行时间?
- 由于某种原因(即使 Java 和 Clojure 版本使用相同的算法),Clojure 版本要慢得多(J:~50ms,C:~400ms)。难道我做错了什么?
如果我犯了一些明显的错误,请原谅我的无知,但我仍处于 Clojure 的学习阶段......
- - -编辑 - - -
我已经对其进行了优化,最终达到了与 Java 相同的时间。我在我的博客中为感兴趣的人描述了它:
http ://blog.programmingdan.com/?p=35