评论者:thheller
很抱歉重新打开。
我正在对我的代码进行一些性能分析,并在性能分析输出中注意到了关于cljs.core/str的警告。
Chrome抱怨说:“未优化。参数值上下文错误”,进一步查看goog.string.buildString的实现。
goog.string.buildString = function(var_args) { return Array.prototype.join.call(arguments, ''); };
鉴于我们从未用它传递超过一个参数,这或许不是最佳实现选择。
也许可以跳过调用并将其内联,如下所示:
`
(defn str
"当没有参数时,返回空字符串。当有一个参数 x 时,返回x.toString()。当(str nil) 时返回空字符串。当参数多于一个时,返回参数的str值连接结果。"
"With no args, returns the empty string. With one arg x, returns x.toString(). (str nil) returns the empty string. With more than one arg, returns the concatenation of the str values of the args."
"With no args, returns the empty string. With one arg x, returns x.toString(). (str nil) returns the empty string. With more than one arg, returns the concatenation of the str values of the args."
([] "")
([x] (if (nil? x)
""
(.join #js [x] "")))
([x & ys]
(loop [sb (StringBuffer. (str x)) more ys]
(if more
(recur (. sb (append (str (first more)))) (next more))
(.toString sb)))))
`
我没有理解这个问题,但为什么我们不使用 .toString?buildString/icon数组方法看起来有点巧妙的?
"我不是很确定整体影响,但由于 cljs.core/str 在我的配置文件中显示得相当高,我认为这应该进一步调查。