2014-11-09 21 views
1

Lau Jensen has this fantastic post使用数组从ClojureScript获得高性能。其中一个他所使用的技术是使用MOD函数这样一个数组获取功能:ClojureScript数组性能需要mod吗?还是仅仅是关于边界检查?

(defn mod [x m] 
    (js* "((x%m)+m)%m")) 

(defn get-cell 
    [b x y] 
    (js* "b[brianscript.core.mod(y,90)][brianscript.core.mod(x,90)]")) 

是否mod功能做任何特殊JavaScript中 - 或者这只是刘不是做边界别处检查和包括它在他的功能?

我的问题是:是为ClojureScript数组性能所需的mod - 或者它只是关于边界检查?

回答

1

brianscript.core.mod()编译成与cljs.core.mod()完全相同的代码。以下是编译clojurescript代码:

cljs.core.mod = (function mod(n,d){return (((n % d) + d) % d); 

他的get-cell重新实现也是不必要的:他用aset将编译相同的javascript代码原始版本。

他不能使用js %运算符(实际上发音为“余数”,而不是“模数”),因为他希望在其邻居检查函数中进行坐标查找以“环绕”棋盘。例如。如果他坐标为0,并且想要将单元格检查到左侧,则索引是89,而不是-1。 -1 % 90 = -1,但是mod(-1, 90) = 89

如果他从编写他自己的mod看到任何性能优势,那么它是而不是,因为他比“cljs.mod”更“沉浸于金属”。可能JavaScript vm会去优化cljs.core.mod,因为它在程序的整个生命周期中都使用不一致类型的参数进行调用。通过“克隆”mod函数并始终用小的int参数调用它,虚拟机可能能够更好,更一致地优化它。但这只是猜测。

他的文章中有很多是完全错误的。他出现在很多情况下是不正确地将java/clojure推理应用到javascript/clojurescript(他从Clojure毕竟移植了这个应用程序)。例如,他使用多维数组的章节引用了Java字节码来争辩javascript多维数组会更快,这是完全不正确的。 (有没有multidim阵列,JS - 也许有些JS VM将优化这种情况下,但要知道的唯一途径是衡量),在另一个地方,他说:

这里[使用数字的真正价值而不是关键字],它允许我们使用一个int数组,它比非类型数组执行速度快大约10-12%。

在clojurescript,int-array(和所有的*-arraymake-array功能)是用于正常的JavaScript数组别名。在Clojure中,这些产生不同类型的Java原始数组,但在Clojurescript中,它们全都是简单的new Array()。他在性能方面获得了提升,因为他正在消除比较关键字对象而不是数字的开销,并且可能是因为他的vm使用更紧凑的数组表示方式,因为它注意到它的整个小整数而不是指针。

优化JavaScript性能非常困难。您必须在多个浏览器中使用逼真的输入和调用模式,每更改。不同的虚拟机会以不同的方式优化不同的方法,并且只有很少的规则可以使用。阅读有关优化js的好消息是Javascript performance for madmen,它只是让你领略一下JS性能如何不可预测。您还应该阅读Jensen引用的David Nolen's post on optimizing clojurescript(David Nolen是Clojurescript的开发人员和维护人员)。

相关问题