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
(和所有的*-array
和make-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的开发人员和维护人员)。