评论者:thheller
很抱歉重新打开这个话题。
我在对代码进行性能分析时,注意到性能分析输出中有关 cljs.core/str 的警告。
Chromes 抱怨说:“未优化。参数值上下文错误”,进一步查看 goog.string.buildString 的实现。
goog.string.buildString = function(var_args) { return Array.prototype.join.call(arguments, ''); };
鉴于我们从未用超过一个参数调用它,这可能不是最好的实现选择。
也许可以跳过调用,并内联方式,如下所示:
`
(defn str
"当没有参数时,返回空字符串。当有一个参数 x 时,返回
x.toString(). (str nil) 返回空字符串。当参数多于
一个时,返回参数的 str 值的连接体。"
([] "")
([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/array 方法看起来有点像是一个巧妙的解决方案?
我不太确定整体影响,但由于 cljs.core/str 在我的配置文件中出现频率很高,我觉得这将需要进一步调查。