我刚刚开始学习Clojure。我注意到的第一件事是没有循环。可以,我可以重复。因此,让我们看一下这个函数(来自Practical Clojure):
(defn add-up
"Adds up numbers from 1 to n"
([n] (add-up n 0 0))
([n i sum]
(if (< n i)
sum
(recur n (+ 1 i) (+ i sum)))))
为了在Javascript中实现相同的功能,我们使用如下循环:
function addup (n) {
var sum = 0;
for(var i = n; i > 0; i--) {
sum += i;
}
return sum;
}
计时后,结果如下所示:
input size: 10,000,000
clojure: 818 ms
nodejs: 160 ms
input size: 55,000,000
clojure: 4051 ms
nodejs: 754 ms
input size: 100,000,000
clojure: 7390 ms
nodejs: 1351 ms
然后,我继续尝试经典的fib(在阅读了此文章之后):
在Clojure中:
(defn fib
"Fib"
[n]
(if (<= n 1) 1
(+ (fib (- n 1)) (fib (- n 2)))))
在js中:
function fib (n) {
if (n <= 1) return 1;
return fib(n-1) + fib(n-2);
}
再次,性能有很大的不同。
fib of 39
clojure: 9092 ms
nodejs: 3484 ms
fib of 40
clojure: 14728 ms
nodejs: 5615 ms
fib of 41
clojure: 23611 ms
nodejs: 9079 ms
注意我在clojure中使用(时间(fib 40)),因此它忽略了JVM的启动时间。这些都是在MacBook Air(1.86
GHz英特尔酷睿2双核)上运行的。
那么,是什么导致Clojure在这里变慢?为什么人们会说“ Clojure快速”?
在此先感谢您,请不要发火焰。
(set! *unchecked-math* true)
(defn add-up ^long [^long n]
(loop [n n i 0 sum 0]
(if (< n i)
sum
(recur n (inc i) (+ i sum)))))
(defn fib ^long [^long n]
(if (<= n 1) 1
(+ (fib (dec n)) (fib (- n 2)))))
(comment
;; ~130ms
(dotimes [_ 10]
(time
(add-up 1e8)))
;; ~1180ms
(dotimes [_ 10]
(time
(fib 41)))
)
来自2.66ghz i7 Macbook Pro OS X 10.7 JDK 7 64bit的所有数字
如您所见,Node.js被删除了。这与1.3.0 alphas一起使用,但是如果您知道自己在做什么,则可以在1.2.0中实现相同的目的。
在我的机器上,用于添加1e8的Node.js 0.4.8约为990ms,fib 41约为7600ms。
Node.js | Clojure
|
add-up 990ms | 130ms
|
fib(41) 7600ms | 1180ms
我正在研究一种算法,它需要以尽可能快的速度生成数百万个数字。实际上,我发现我的算法的rand()函数占用了75%的处理时间。 所以我在找更快的东西。而且我根本不需要大范围。(我只需要1000以下的整数) 你知道我需要什么吗? 谢啦! 编辑: 我使用这个数字来洗牌少于1000个实体的组。 我发现了更多关于“快速兰特”的信息。还有SSE版本,它更快,一次生成4个数字。 https://software
问题内容: 我正在使用Cookies模块来设置cookie。这是我的代码: 但是在文档中,我还没有找到如何 销毁 该Cookie的方法。 任何建议,将不胜感激。 问题答案: 无法根据HTTP规范删除cookie。为了有效地“删除” cookie,您可以将过期日期设置为过去的某个日期。本质上,这将为您带来以下收益(根据Cookies模块文档): 或根据HTTP规范: 两者都应该起作用。您可以替换与一
问题内容: 我想使用Biot- Savart定律 来计算某些导体的磁场,并且我想使用1000x1000x1000的矩阵。在使用MATLAB之前,但现在我想使用Python。Python比MATLAB慢吗?如何使Python更快? 编辑:也许最好的方法是使用C / C ++计算大型数组,然后将其传输到Python。然后我想用VPython可视化。 EDIT2:在我的情况下哪个更好:C还是C ++?
问题内容: 我听说散列(即将字符串或对象转换为数字)用于字符串等,因为比较数字比字符串更容易。如果为真,这是什么原因? 问题答案: 不一定是这种情况,但大多数时候可能是这样。 请考虑以下情况: 我想比较字符串“ apples”和“ oranges”。如果我只想确定“ apples” ==“ oranges”,我只需要比较每个字符串的第一个字符:’a’!=’o’=>“ apples”!=“ oran
引导任务boot cljs repl提供了一种连接到ClojureScript repl的方法,ClojureScript repl与正在运行的浏览器实例交互。 如果正确地添加到build.boot依赖项中,可以从Clojure repl中调用函数,以便启动ClojureScript REPL。 我正在使用Emacs通过苹果酒软件包连接clojure REPL,该软件包具有以下功能: 我试图弄清楚
Clojure是一种LISP风格的语言,运行在JVM上。Clojure的一大特色就是其并发机制,它支持不可变的数据结构(Clojure是来自于可持久化的数据结构)。Clojure还有一个特色是软件事务存储(Software Transactional Memory,STM),其支持用事务代替锁和互斥器来更新共享内存。STM还是一个有争议的技术,还需要更好的证明自己,一个简单的办法就是访问一个JVM上的实现。