加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么clojure比别的基准的scala更糟糕

发布时间:2020-12-16 09:01:25 所属栏目:安全 来源:网络整理
导读:见 http://shootout.alioth.debian.org/u32q/compare.php?lang=clojure Clojure比java -server慢得多,而scala不是. 是什么赋予了? 参考:On Performance and Java Interoperability: Clojure vs. Scala 解决方法 你可以用任何语言编写快速或慢速代码:-) 基
见 http://shootout.alioth.debian.org/u32q/compare.php?lang=clojure
Clojure比java -server慢得多,而scala不是.

是什么赋予了?

参考:On Performance and Java Interoperability: Clojure vs. Scala

解决方法

你可以用任何语言编写快速或慢速代码:-)

基于对Clojure代码的快速检查,我会说,性能差异的主要原因是Clojure基准代码尚未完全优化,以使用最快的语言功能.

例如,Clojure中的以下功能对于开发方便来说非常酷和有用,但是会产生一些运行时性能开销:

> Lazy序列和列表
>使用反射动态Java互操作性
>运行时功能组合/第一类功能
>多方法/动态调度
>使用eval或REPL动态编译
> BigInteger算术

如果你想要绝对的最大性能(以一些额外的复杂性为代价),你需要重写代码,以避免这些并且使用如下:

>静态类型提示(避免反射)
>瞬变
>宏(用于编译时代码操作)
>协议
> Java基元和数组
循环/循环迭代

通过明智的使用上述方法,我发现通常可以在Clojure 1.2中非常接近Java性能,例如考虑以下代码做一百万次添加:

未优化的Clojure使用懒惰序列和泛化算术.它的功能非常好,但并不是特别快:

(reduce 
  (fn [acc val] (unchecked-int (unchecked-add (int acc) (int val)))) 
  (range 0 1000000))

=> "Elapsed time: 65.201243 msecs"

优化的Clojure与原始算术和循环/重现:

(loop [acc (int 0) i (int 0)] 
  (if (>= i (int 1000000)) 
    acc 
    (recur (unchecked-add acc i) (unchecked-inc i)) ))

=> "Elapsed time: 0.691474 msecs"

Java代码,一个漂亮的标准迭代循环:

public static int addMillion() {
    int result=0;
    for (int i=0; i<1000000; i++) {
        result+=i;
    }
    return result;
}

=> "Elapsed time: 0.692081 msecs"

附:我使用unchecked-add而不是在Clojure代码中,以便它匹配Java的整数溢出行为.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读