java – 什么减慢了这个Clojure功能?
发布时间:2020-12-14 06:02:22 所属栏目:Java 来源:网络整理
导读:我在Clojure工作 Project Euler problem 14.我有一个很好的通用算法,我得到了正确的结果,但我很难理解为什么我的函数与Java中的等效函数相比(我相信)是如此之慢.这是我的Clojure函数,用于从给定的起始编号获取Collat??z链的长度: (defn collatz-length [n]
我在Clojure工作
Project Euler problem 14.我有一个很好的通用算法,我得到了正确的结果,但我很难理解为什么我的函数与Java中的等效函数相比(我相信)是如此之慢.这是我的Clojure函数,用于从给定的起始编号获取Collat??z链的长度:
(defn collatz-length [n] (loop [x n acc 1] (if (= 1 x) acc (recur (if (even? x) (/ x 2) (inc (* 3 x))) (inc acc))))) 这是我的Java函数做同样的事情: public static int collatzLength(long x) { int count = 0; while (x > 1) { if ((x % 2) == 0) { x = x / 2; } else { x = (x * 3) + 1; } count++; } return count; } 为了计算这些函数的性能,我使用了以下Clojure代码: (time (dorun (map collatz-length (range 1 1000000)))) 以下Java代码: long starttime = System.currentTimeMillis(); int[] nums = new int[1000000]; for (int i = 0; i < 1000000; i++) { nums[i] = collatzLength(i+1); } System.out.println("Total time (ms) : " + (System.currentTimeMillis() - starttime)); Java代码在我的机器上运行304毫秒,但Clojure代码需要4220毫秒.是什么导致了这个瓶颈,我如何才能提高Clojure代码的性能? 解决方法
您正在使用盒装数学,因此数字会不断被装箱和取消装箱.尝试类似的东西:
(set! *unchecked-math* true) (defn collatz-length ^long [^long n] (loop [x n acc 1] (if (= 1 x) acc (recur (if (zero? (rem x 2)) (quot x 2) (inc (* 3 x))) (inc acc))))) (time (dorun (loop [i 1] (when (< i 1000000) (collatz-length i) (recur (inc i)))))) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- USACO Section 1.2(完全枚举)
- Hibernate eq方法:设置等于条件
- java – 如何引用创建对象的对象?
- java – 如何将图像绘制到JPanel或JFrame?
- Java代码审计 HTTP头操纵 response.addHeader()
- 在java中将UTC转换为IST时间在LOCAL中工作,但在CLOUD SERVE
- java – 是否有可能重载GWT i18n中的Messages-Methods
- java – 找不到媒体类型= Application / json,glassfish的M
- 基于HttpClient在HTTP协议接口测试中的使用(详解)
- java – 有没有办法释放饱和连接池?