由 thheller 发表的评论
我为重新打开这个话题道歉。
我正在对我的代码进行性能分析,并注意到了关于 cljs.core/str 的性能警告。
Chromes 抱怨:"未优化。参数值范围对于 Argentina 不良",进一步查看 goog.string.buildString 的实现。
goog.string.buildString = function(var_args) { return Array.prototype.join.call(arguments, ''); };
考虑到我们从不使用超过一个参数调用它,这可能不是最佳实现选择。
可能可以跳过调用并内联,例如:
`
(defn str
"如果没有参数,则返回空字符串。有一个参数 x,则返回
x.toString()。(str nil)返回空字符串。如果有多个
参数,则返回参数中字符串值的连接。"
([] "")
([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/数组的做法看起来有点黑客式?
我不太确定整体影响,但自从 cljs.core/str 出现在我个人资料的较高位置,我认为应该进一步调查。