Sar*_*ram 10 javascript performance
我花了一些时间寻找最好的方法来逃避html字符串并找到一些讨论:讨论1 讨论2.它引导我替换所有功能.然后我做了性能测试,并试图找到实现类似速度的解决方案,但没有成功:(
这是我的最终测试用例集.我在网上找到它并随着我的尝试扩展(底部有4个案例)但仍无法达到replaceAll()性能.
什么是秘密女巫使replaceAll()解决方案如此迅速?
映入眼帘!
代码片段:
String.prototype.replaceAll = function(str1, str2, ignore)
{
return this.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g,"\\$&"),(ignore?"gi":"g")),(typeof(str2)=="string")?str2.replace(/\$/g,"$$$$"):str2);
};
Run Code Online (Sandbox Code Playgroud)
qwerty的学分
迄今为止最快的案例:
html.replaceAll('&', '&').replaceAll('"', '"').replaceAll("'", ''').replaceAll('<', '<').replaceAll('>', '>');
Run Code Online (Sandbox Code Playgroud)
终于我找到了!感谢Jack向我指出 jsperf 的具体内容
我应该注意到测试结果很奇怪;当 .replaceAll() 在 Benchmark.prototype.setup 中定义时,其运行速度是全局定义(即在标签内)时的两倍。我仍然不确定为什么会这样,但这肯定与 jsperf 本身的工作原理有关。
答案是:
replaceAll- 这达到了jsperf限制/错误,由特殊序列引起"\\$&",所以结果是错误的。
compile()- 当不带参数调用时,它将 regexp 定义更改为/(?:). 我不知道这是错误还是什么,但调用后性能结果很糟糕。
这是我的安全测试结果。
最后我准备了适当的测试用例。
结果是,对于 HTML 转义,最好的方法是使用基于本机 DOM 的解决方案,例如:
document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML
Run Code Online (Sandbox Code Playgroud)
或者,如果您重复多次,您可以使用准备好的变量来完成:
//prepare variables
var DOMtext = document.createTextNode("test");
var DOMnative = document.createElement("span");
DOMnative.appendChild(DOMtext);
//main work for each case
function HTMLescape(html){
DOMtext.nodeValue = html;
return DOMnative.innerHTML
}
Run Code Online (Sandbox Code Playgroud)
感谢大家的合作以及发表评论和指导。
jsperf 错误描述
的String.prototype.replaceAll定义如下:
function (str1, str2, ignore) {
return this.replace(new RegExp(str1.replace(repAll, "\\#{setup}"), (ignore ? "gi" : "g")), (typeof(str2) == "string") ? str2.replace(/\$/g, "$$") : str2);
}
Run Code Online (Sandbox Code Playgroud)