Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么是性能机密?[HTML转义]_Javascript_Performance - Fatal编程技术网

Javascript 什么是性能机密?[HTML转义]

Javascript 什么是性能机密?[HTML转义],javascript,performance,Javascript,Performance,我花了一些时间寻找转义html字符串的最佳方法,并发现了一些关于这方面的讨论:。它引导我走向功能。然后,我进行了性能测试,并试图找到实现类似速度的解决方案,但没有成功:( 这是我的最终版本。我在网上找到了它,并进行了扩展(底部有4个案例),但仍然无法达到replaceAll()performance //example below var test = "This is a test string"; var test2 = test.split("a").join("A"); 什么是秘密巫婆

我花了一些时间寻找转义html字符串的最佳方法,并发现了一些关于这方面的讨论:。它引导我走向功能。然后,我进行了性能测试,并试图找到实现类似速度的解决方案,但没有成功:(

这是我的最终版本。我在网上找到了它,并进行了扩展(底部有4个案例),但仍然无法达到
replaceAll()
performance

//example below
var test = "This is a test string";
var test2 = test.split("a").join("A");
什么是秘密巫婆使得
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);
};
String.prototype.replaceAll=函数(str1、str2、忽略)
{
返回此.replace(new RegExp(str1.replace(/([\/\,\!\\^$\\\\\\\\\[\]\(\)\.*\+\?\\\\\-\&])/g,“\\$&”),(忽略?“gi”:“g”),(typeof(str2)=“string”)?str2.replace(/\$/g,“$$”:str2);
};
学分

迄今为止最快的案例:

html.replaceAll('&', '&amp;').replaceAll('"', '&quot;').replaceAll("'", '&#39;').replaceAll('<', '&lt;').replaceAll('>', '&gt;');
html.replaceAll('&','&;').replaceAll('“,'“).replaceAll(''“,'&;')).replaceAll('“,”);

实际上,有更快的方法可以做到这一点

如果您可以进行内联拆分和联接,您将获得更好的性能

//example below
var test = "This is a test string";
var test2 = test.split("a").join("A");

试试这个,然后运行性能测试。

就性能而言,我发现下面的函数非常好:

String.prototype.htmlEscape = function() {
    var amp_re = /&/g, sq_re = /'/g, quot_re = /"/g, lt_re = /</g, gt_re = />/g;

    return function() {
        return this
          .replace(amp_re, '&amp;')
          .replace(sq_re, '&#39;')
          .replace(quot_re, '&quot;')
          .replace(lt_re, '&lt;')
          .replace(gt_re, '&gt;');
    }
}();
这样做会把其他一切都吹出水面

.compile()
之所以能提供如此高的性能,是因为当你编译一个全局表达式时,例如
/a/g
,它会被转换成
/(?:)/
(在Chrome上),这使得它毫无用处

如果编译无法完成,浏览器应该抛出一个错误,而不是默默地销毁它。

我终于找到了它! 感谢您向我介绍jsperf的具体内容

我应该注意到,测试结果很奇怪;when.replaceAll()是 在Benchmark.prototype.setup中定义它的运行速度是原来的两倍 与全局定义(即标记内部)时相比。 我仍然不确定这是为什么,但它肯定与 jsperf本身是如何工作的

答案是:

replaceAll
-这达到了jsperf限制/错误,是由特殊序列
“\\\$&”
引起的,因此结果是错误的

compile()

这是我的名片

我终于准备好了

结果是,对于HTML escape,最好使用基于本机DOM的解决方案,如:

document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML
或者,如果重复多次,可以使用准备好的变量:

//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
}
感谢大家的合作和发表评论和指导

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);
}

许多内置方法都是在本机代码中实现并经过预优化的(regex就是其中之一),在Javascript中以更快的方式对它们进行仿真是非常困难的。当然,但为什么要“替换新的RegExp”呢case太慢了。它也使用RegExp。不使用regex仍然替换似乎更快@Mr_Green多次替换是错误的,因为它只替换第一次出现的内容:)始终编译您的regex;请看上面的@Joachim Isaksson评论。我想他找到了窍门。@Saram我没有用弃用的
.compile()
进行测试,但我怀疑这是一个有用的统计数据。测试基准中的某些内容正在影响结果。@Saram还根据,编译了文字正则表达式。@Saram我已经用编译版本更新了代码;我仍然觉得浏览器应该针对这些东西进行优化。我发现
compile()
会破坏regexp,所以不能使用它。看起来像一个bug。使用replaceAll函数:0.054秒/使用replaceAll2函数:0.106秒/内联拆分/加入:0.111秒/内联RegExp对象:0.182秒内联RegExp对象不带字符串:0.134秒启动任何bug测试(其中replaceAll在setup()中定义)时是否可以链接到jsperf bug?@Jack过程)转到控制台并显示
String.prototype.replaceAll的主体。我会在一分钟内做一些评论来回答。