当前位置: 首页 > 面试题库 >

NodeJ比Clojure快吗?

纪晨
2023-03-14
问题内容

我刚刚开始学习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上的实现。