Programming Clojure学习笔记——与Java一起工作

来源:互联网 发布:网络大电影 杀无赦 编辑:程序博客网 时间:2024/05/16 11:43
3.2  性能优化
使用原始类型
示例:
第一种计算方法:
user=> (defn sum-to [n]
   (loop [i 1 sum 0]
     (if (<= i n)
       (recur (inc i) (+ i sum))
       sum)))
#'user/sum-to
user=> (dotimes [_ 5] (time (sum-to 10000)))
"Elapsed time: 9.112735 msecs"
"Elapsed time: 5.394529 msecs"
"Elapsed time: 2.786857 msecs"
"Elapsed time: 2.731407 msecs"
"Elapsed time: 2.598431 msecs"

第二种计算方法:
user=> (defn integer-sum-to [n]
(let [n (int n)]
  (loop [i (int 1) sum (int 0)]
    (if (<= i n)
      (recur (inc i) (+ i sum))
      sum))))
#'user/integer-sum-to
user=> (dotimes [_ 5] (time (integer-sum-to 10000)))
"Elapsed time: 2.126595 msecs"
"Elapsed time: 1.82419 msecs"
"Elapsed time: 0.105251 msecs"
"Elapsed time: 0.055963 msecs"
"Elapsed time: 0.086769 msecs"
说明:
1. 第二种计算方法将n, i, sum当作int类型处理
2. dotimes是一个计时函数
(dotimes bindings & body)
; bindings => name n
重复执行body代码,循环将name绑定到0到n-1,n即为重复次数

添加类型暗示
Clojure支持给函数参数,let绑定,变量名及表达式添加类型暗示。
类型暗示的作用:
1. 优化关键性能
2. 说明需要的类型
3. 运行时强制转换为需要的类型
示例:
user=> (defn describe-class [#^Class c]
  {:name (.getName c)
    :final (java.lang.reflect.Modifier/isFinal (.getModifiers c))})
user=> (describe-class StringBuffer)
{:name "java.lang.StringBuffer", :final true}
说明:给函数参数c添加类型暗示
原创粉丝点击