我是Clojure的新手。在實驗中,我寫了函數來計算n!
。我的Clojure代碼如下:用Clojure寫的階乘函數的低性能
(defn factorial
[n]
(reduce * (biginteger 1) (range 1 (inc n))))
然後我在repl中運行以下代碼。
(time (factorial 100))
這是結果:
"Elapsed time: 0.50832 msecs"
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000N
我然後創建Ruby中類似的解決方案:
def factorial(n)
start = Time.now.to_f
(2..n).inject(1) { |p, f| p * f }
finish = Time.now.to_f
time_taken = finish - start
puts "It took: #{(time_taken * 1000)} msecs"
end
的與IRB我跑factorial(100)
,導致:
It took: 0.06556510925292969 msecs
=> 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
雖然我已經看到多數證據表明Clojure應該具有卓越的性能,但Ruby版本的性能似乎要明顯更高。有什麼我誤解或我的Clojure解決方案的某些元素會減慢速度?
嘗試使用'bigint',而不是'biginteger'。 – ndn
是的,那工作bigint使執行速度更快。 –
由於JVM如何「預熱」功能,在此基準測試中使用'time'會帶來嚴重的誤導。如果你接受Java平臺設計者定義的「快速」爲「快速,一旦它被加熱到足以進行編譯」 –