Heim Web-Frontend js-Tutorial eval的两组性能测试数据_javascript技巧

eval的两组性能测试数据_javascript技巧

May 16, 2016 pm 05:50 PM
eval 性能测试

@老赵 的一个微博“ 由eval生成的代码效率真的很差吗? http://t.cn/zWTUBEo 内含人身攻击,不喜勿入。”
引发了最近对eval火爆的讨论,教主 @Franky 和 灰大 @otakustay 也给了精彩的数据分析。
刚好之前也做过类似的测试,我也跟风凑个热闹,提供两组数据供大家参考。

更新1: 感谢灰大 @otakustay 的指导,为排除eval('')调用本身对结果的影响,增加一组新数据A3, B3。并对旧的全部数据重测。
更新2: 感谢莫大 @貘吃馍香 的强力拍砖,增加了1). A4, B4;A5,B5的eval覆盖后的测试数据; 2). A6,B6 eval别名;3). A7,B7 eval.call。

测试环境:
a. 机器:Intel(R) Corei7-2720 2.2Ghz (4核心8线程)、内存8Gb
b. OS:Windows 7 Enterprise SP1 64-bit
c. 浏览器:
b.1 Google Chrome 21.0.1180.79 m
b.2 Firefox 14.0.1
b.3 IE9.0.8112.16421
d. 测试方法
d.1 每个用例测试5次,耗时取最小值。
d.2 测试过程中没有开启Firebug或Chrome Console,开启这些工具会使时间倍增,很难在有效时间内得到该用例结果

用例A1:
我们在内联函数中调用空的eval("")

复制代码 代码如下:

!function() {
var a = 1,
b = 2,
c = true;
function func() {
var d = 2;
e = !c;
eval("");
}
for (var i = 0; i func(i, i + 1, i + 2);
}
}();

用例A2:
注释掉内联函数中的eval("")
复制代码 代码如下:

!function() {
var a = 1,
b = 2,
c = true;
function func() {
var d = 2;
e = !c;
//eval("");
}
for (var i = 0; i func(i, i + 1, i + 2);
}
}();

用例A3:
为排除eval("")调用本身产生的影响,我们在外层函数中调用eval("")
复制代码 代码如下:

!function() {
var a = 1,
b = 2,
c = true;
function func() {
var d = 2;
e = !c;
}
for (var i = 0; i eval("");
func(i, i + 1, i + 2);
}
}();

用例A4:
将eval()函数覆盖成普通的空函数
复制代码 代码如下:

function eval(){}
!function() {
var a = 1,
b = 2,
c = true;
function func() {
var d = 2;
e = !c;
eval("");
}
for (var i = 0; i func(i, i + 1, i + 2);
}
}();

用例A5:

同样是函数调用,不是eval而且另一个空函数f
复制代码 代码如下:

function f(){}
!function() {
var a = 1,
b = 2,
c = true;
function func() {
var d = 2;
e = !c;
f("");
}
for (var i = 0; i func(i, i + 1, i + 2);
}
}();

用例A6:
将eval赋给另一个变量f,然后调用f
复制代码 代码如下:

var f = eval;
!function() {
var a = 1,
b = 2,
c = true;
function func() {
var d = 2;
e = !c;
f("");
}
for (var i = 0; i func(i, i + 1, i + 2);
}
}();

用例A7:

使用eval.call的方式去调用
复制代码 代码如下:

!function() {
var a = 1,
b = 2,
c = true;
function func() {
var d = 2;
e = !c;
eval.call(null, '');
}
for (var i = 0; i func(i, i + 1, i + 2);
}
}();

A组测试结果: 

A1 A2 A3 A4 A5 A6 A7 A1 : A2 A1 : A3 A1 : A4 A4 : A5
Chrome 1612ms 8ms 1244ms 897ms 7ms 718ms 680ms 201.5 1.3 1.8 128.1
Firefox 2468ms 69ms 732ms 2928ms 134ms 5033ms 4984ms 35.8 3.4 0.8 21.9
IE 1207ms 23ms 233ms 1147ms 37ms 148ms 224ms 52.5 5.2 1.0 31.0
用例B1:
复制代码 代码如下:

for (var i = 0; i !function() {
var a = 1,
b = 2,
c = true;
!function () {
var d = 2;
e = !c;
eval("");
}();
}();
}

用例B2:
复制代码 代码如下:

for (var i = 0; i !function() {
var a = 1,
b = 2,
c = true;
!function () {
var d = 2;
e = !c;
//eval("");
}();
}();
}

用例B3:
复制代码 代码如下:

for (var i = 0; i !function() {
var a = 1,
b = 2,
c = true;
!function () {
var d = 2;
e = !c;
}();
}();
eval("");
}

用例B4:
复制代码 代码如下:

var eval = function(){}
for (var i = 0; i !function() {
var a = 1,
b = 2,
c = true;
!function () {
var d = 2;
e = !c;
eval("");
}();
}();
}

用例B5:
复制代码 代码如下:

var f = function(){}
for (var i = 0; i !function() {
var a = 1,
b = 2,
c = true;
!function () {
var d = 2;
e = !c;
f("");
}();
}();
}

用例B6:
复制代码 代码如下:

var f = eval;
for (var i = 0; i !function() {
var a = 1,
b = 2,
c = true;
!function () {
var d = 2;
e = !c;
f("");
}();
}();
}

用例B7:
复制代码 代码如下:

for (var i = 0; i !function() {
var a = 1,
b = 2,
c = true;
!function () {
var d = 2;
e = !c;
eval.call(null, '');
}();
}();
}

B组测试结果:
B1 B2 B3 B4 B5 B6 B7 B1 : B3 B1 : B2 B1 : B4 B4 : B5
Chrome 1569ms 134ms 1093ms 1022ms 173ms 830ms 916ms 11.7 1.4 1.5 5.9
Firefox 5334ms 1017ms 5503ms 5280ms 1171ms 6797ms 6883ms 5.2 1.0 1.0 4.5
IE 3933ms 560ms 680ms 4118ms 583ms 745ms 854ms 7.0 5.8 1.0 111.3

结论(仅限于文中的CASE):

1.  eval本身的重复调用非常耗时,即使是空的eval("");

2.  eval对内联函数执行效率有所影响,依具体环境、代码有所不同;

3.  我们可以看到无论哪种浏览器,无论是A组还是B组,2 和 5速度较佳。说明例中内联函数的eval无论以何种方式调用(即使eval被空函数覆盖)仍会对运行效率造成较大影响。推断是(黑盒推断,非权威,很可能是臆测)内联函数中只要发现eval,哪怕这个eval是被覆盖的空函数,在Scope Variables中都将会把所有的外部定义的变量等内容初始化到当前的Scope中。类似的,eval会对内联函数在运行时JS引擎的优化功能产生较大影响,降低执行效率。

4. 说点题外话,虽然没用IE10,而是IE9,在对eval的处理上,表现非常的优异。IE一直被开发人员诟病,但它的飞速成长也是值得肯定的,本例就是很好的一项证明。 

更详细的原因剖析下列文章描述已十分详细,不再累述。欢迎拍砖:)尤其是莫大... 

 @老赵          的 《由eval生成的代码效率真的很差吗?》 
 @Franky      的  《Eval科普》 
 @otakustay  的 《浅谈Eval的影响》 

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So verwenden Sie Docker für Leistungstests und Stresstests von Containern So verwenden Sie Docker für Leistungstests und Stresstests von Containern Nov 07, 2023 pm 04:53 PM

Für die Verwendung von Docker für Leistungstests und Stresstests von Containern sind spezifische Codebeispiele erforderlich. Einführung Der Aufstieg der Containervirtualisierungstechnologie hat die Bereitstellung und den Betrieb von Anwendungen flexibler und effizienter gemacht, und eines der beliebtesten Tools ist Docker. Als leichte Containerisierungsplattform bietet Docker eine bequeme Möglichkeit, Anwendungen zu verpacken, zu verteilen und auszuführen. Wie man jedoch die Leistung von Containern testet und bewertet, insbesondere Stresstests unter Hochlastbedingungen, ist eine Frage, die viele Menschen beschäftigt. In diesem Artikel wird vorgestellt

Was bedeutet Auswertung in Python? Was bedeutet Auswertung in Python? May 22, 2019 pm 03:18 PM

eval bedeutet „Auswertung“ und ist eine in Python integrierte Funktion, die verwendet wird, um einen Zeichenfolgenausdruck auszuführen und das Berechnungsergebnis des Ausdrucks zurückzugeben, d. h. beim Zuweisen einer Variablen ist die Darstellung auf der rechten Seite des Gleichheitszeichens im Format einer Zeichenfolge geschrieben. Der Rückgabewert ist das Ergebnis dieses Ausdrucks. Syntax „eval(expression[, globals[, locals]])“.

Der Unterschied zwischen Leistungstests und Unit-Tests in der Go-Sprache Der Unterschied zwischen Leistungstests und Unit-Tests in der Go-Sprache May 08, 2024 pm 03:09 PM

Leistungstests bewerten die Leistung einer Anwendung unter verschiedenen Lasten, während Komponententests die Korrektheit einer einzelnen Codeeinheit überprüfen. Leistungstests konzentrieren sich auf die Messung von Antwortzeit und Durchsatz, während Unit-Tests sich auf Funktionsausgabe und Codeabdeckung konzentrieren. Leistungstests simulieren reale Umgebungen mit hoher Last und Parallelität, während Unit-Tests unter niedrigen Last- und seriellen Bedingungen ausgeführt werden. Das Ziel von Leistungstests besteht darin, Leistungsengpässe zu identifizieren und die Anwendung zu optimieren, während das Ziel von Unit-Tests darin besteht, die Korrektheit und Robustheit des Codes sicherzustellen.

Praxis für Nginx-Lastausgleichsleistungstests und -optimierung Praxis für Nginx-Lastausgleichsleistungstests und -optimierung Oct 15, 2023 pm 12:15 PM

Übersicht über Leistungstests und Optimierungspraktiken für den Nginx-Lastausgleich: Als leistungsstarker Reverse-Proxy-Server wird Nginx häufig in Anwendungsszenarien für den Lastausgleich verwendet. In diesem Artikel erfahren Sie, wie Sie Leistungstests für den Nginx-Lastausgleich durchführen und seine Leistung durch Optimierungspraktiken verbessern. Vorbereitung des Leistungstests: Bevor wir den Leistungstest durchführen, müssen wir einen oder mehrere Server mit guter Leistung vorbereiten, Nginx installieren und Reverse-Proxy und Lastausgleich konfigurieren. Auswahl des Testwerkzeugs: Um reale Lastbedingungen zu simulieren, können wir Common verwenden

So implementieren Sie die zugrunde liegende MySQL-Optimierung: Erweiterte Verwendung und Analyse von Leistungstest- und Optimierungstools So implementieren Sie die zugrunde liegende MySQL-Optimierung: Erweiterte Verwendung und Analyse von Leistungstest- und Optimierungstools Nov 08, 2023 pm 03:27 PM

So erreichen Sie eine zugrunde liegende Optimierung von MySQL: Erweiterte Verwendung und Analyse von Leistungstest- und Optimierungstools Einführung MySQL ist ein häufig verwendetes relationales Datenbankverwaltungssystem, das in verschiedenen Webanwendungen und großen Softwaresystemen weit verbreitet ist. Um die Betriebseffizienz und Leistung des Systems sicherzustellen, müssen wir eine zugrunde liegende Optimierung von MySQL durchführen. In diesem Artikel wird beschrieben, wie Sie Leistungstest- und Optimierungstools für eine erweiterte Verwendung und Analyse verwenden, und es werden spezifische Codebeispiele bereitgestellt. 1. Auswahl und Einsatz von Leistungstesttools Leistungstesttools sind wichtig für die Bewertung der Systemleistung und von Engpässen

Ausführlicher Leistungstest des Red Magic 9 Pro: Damit endet der Leistungswettbewerb vorzeitig Ausführlicher Leistungstest des Red Magic 9 Pro: Damit endet der Leistungswettbewerb vorzeitig Feb 03, 2024 pm 04:35 PM

Es muss gesagt werden, dass das Red Magic in diesem zunehmend homogenisierten Mobilfunkmarkt tatsächlich eine recht einzigartige und ungewöhnliche Existenz darstellt. Während die gesamte Gaming-Handy-Kategorie mit dem verbesserten Energieverbrauchsverhältnis von Qualcomm Snapdragon zu kämpfen hat, haben die Red Devils stets an ihren eigenen Produktkonzepten festgehalten: Mit einem geraden Gehäuse und aktiver Wärmeableitung wollen sie lediglich eine Leistungsveröffentlichung. . Während die Flaggschiff-Mobiltelefone der gesamten Branche aufgrund der ständigen Anhäufung von Bildmodulen immer kleiner werden, bieten Ihnen die Red Devils tatsächlich ein flaches Rückkameradesign. Dies ist möglicherweise sogar der erste Trend in der gesamten Mobiltelefonbranche in der Vergangenheit vier oder fünf Jahre. Das einzige Produkt auf dem Markt. (Quelle: Red Devils) Das Wichtigste ist, dass es Red Devils als Meister der Meinungen der Internetnutzer wirklich gelungen ist, eine Gruppe von Fans anzuziehen. Wenn die Flaggschiff-Untermarken mehrerer großer Hersteller für etwa 3.000 Yuan verkauft werden

So deaktivieren Sie die Auswertung in PHP unter Win So deaktivieren Sie die Auswertung in PHP unter Win Oct 31, 2022 am 09:33 AM

So deaktivieren Sie eval unter Win: 1. Laden Sie „PHP_diseval_extension“ herunter. 2. Suchen Sie das aktuell vom Server verwendete PHP. 4. Fügen Sie den Code „extension=diseval.so“ hinzu. Starten Sie den Dienst neu.

Ratschläge zur Vue-Entwicklung: So führen Sie Leistungstests und Leistungsoptimierungen durch Ratschläge zur Vue-Entwicklung: So führen Sie Leistungstests und Leistungsoptimierungen durch Nov 22, 2023 pm 12:01 PM

Bei der Vue-Entwicklung ist Leistung ein sehr wichtiges Thema. Wenn wir Anwendungen mit hervorragender Leistung entwickeln können, werden das Benutzererlebnis und die Wettbewerbsfähigkeit auf dem Markt erheblich verbessert. Um dies zu erreichen, müssen wir Leistungstests und Leistungsoptimierungen durchführen. In diesem Artikel wird erläutert, wie Sie Leistungstests und Leistungsoptimierungen durchführen. 1. Leistungstests Leistungstests sind der Schlüssel zur Verbesserung der Anwendungsleistung. Es kann die Faktoren erkennen, die Leistungsprobleme in der Anwendung verursachen, und diese dann optimieren. Um Leistungstests durchzuführen, können wir die folgenden Methoden anwenden: 1. Benchmark-Tests Benchmark-Tests sind

See all articles