首頁 web前端 js教程 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);
}
}();

用例A55>}();


用例A55>}();
用例A55>}(); 用例A55 :
同樣是函數調用,不是eval而且另一個空函數f




複製程式碼



複製程式碼


程式碼如下:


function f(){}
!function() {
var a = 1,
b = 2,
c = true;
function func( ) { }();


用例A6:
將eval賦給另一個變數f,然後呼叫f




複製程式碼


程式碼如下:


var f = eval; {
var a = 1,
b = 2,
c = true;
function func() {
var d = 2;
e = !c;
用例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 < 2999999; i++) {
!function() {
var a = 1,
b = 2,
c = true;
!function () {
var d = 2;
e = !c;
eval("");
}();
}();
}

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

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

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

for (var i = 0; i < 2999999; 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 < 2999999; 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 < 2999999; 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 < 2999999; i++) {
!function() {
var a = 1,
b = 2,
c = true;
!function () {
var d = 2;
e = !c;
f("");
}();
}();
}

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

for (var i = 0; i < 2999999; 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科普》 
 @otakay  @otakay

  @otakay 
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1677
14
CakePHP 教程
1431
52
Laravel 教程
1334
25
PHP教程
1280
29
C# 教程
1257
24
如何使用Docker進行容器的效能測試和壓力測試 如何使用Docker進行容器的效能測試和壓力測試 Nov 07, 2023 pm 04:53 PM

如何使用Docker進行容器的效能測試和壓力測試,需要具體程式碼範例引言容器虛擬化技術的興起使得應用程式的部署和運行更加靈活和高效,其中最受歡迎的工具之一就是Docker。作為一種輕量級的容器化平台,Docker提供了一種方便的方式來打包、分發和運行應用程序,但是如何對容器的性能進行測試和評估,特別是在高負載情況下的壓力測試,是很多人關心的問題。本文將介紹

python中eval是什麼意思? python中eval是什麼意思? May 22, 2019 pm 03:18 PM

eval的意思是“評估”,是python中的一個內建函數,用於執行一個字串表達式,並返回表達式的計算結果;即變數賦值時,等號右邊的表示是寫成字串的格式,傳回值就是這個表達式的結果。語法“eval(表達式[, globals[, locals]])”。

win下php怎麼禁止eval win下php怎麼禁止eval Oct 31, 2022 am 09:33 AM

win下php禁止eval的方法:1、下載「PHP_diseval_extension」;2、找到伺服器目前使用的PHP;3、開啟PHP設定檔 ;4、新增「extension=diseval.so」程式碼;5、重啟服務即可。

Go語言中的效能測試與單元測試的差異 Go語言中的效能測試與單元測試的差異 May 08, 2024 pm 03:09 PM

效能測試評估應用程式在不同負載下的效能,而單元測試驗證單一程式碼單元的正確性。效能測試著重於測量反應時間和吞吐量,而單元測試則關注函數輸出和程式碼覆蓋率。性能測試透過高負載和並發模擬實際環境,而單元測試在低負載和串行條件下運行。效能測試的目標是識別效能瓶頸和最佳化應用程序,而單元測試的目標是確保程式碼正確性和健全性。

Nginx負載平衡的效能測試與調優實踐 Nginx負載平衡的效能測試與調優實踐 Oct 15, 2023 pm 12:15 PM

Nginx負載平衡的效能測試與調優實務概述:Nginx作為高效能的反向代理伺服器,常用於負載平衡的應用場景。本文將介紹如何進行Nginx負載平衡的效能測試,並透過調優實務提升其效能。效能測試準備:在進行效能測試之前,我們需要準備一台或多台具備較好效能的伺服器,安裝Nginx,並設定反向代理與負載平衡。測試工具選擇:為了模擬真實的負載情況,我們可以使用常見

紅魔鬼9 Pro深度性能測試:它提前結束了性能競賽 紅魔鬼9 Pro深度性能測試:它提前結束了性能競賽 Feb 03, 2024 pm 04:35 PM

在不得不說,在這個日趨同化的手機市場中,紅魔鬼確實是個相當獨特的異樣存在。在整個遊戲手機品類,都因為高通驍龍的能耗比提升而苦苦掙扎的時候,紅魔倒是始終堅持著自己的一套產品理念,直板機身加主動散熱,要的就是一個性能釋放拉滿。在整個行業的旗艦手機,都因為不斷堆料的影像模組而變得越來越駝背時,紅魔居然真的就給你玩純平後攝設計,這甚至可能是近四五年來,整個手機市場上僅此一家的產品。 (圖源:紅魔鬼)最重要的是,作為網友意見的集大成者,紅魔真的成功吸引了一批擁躉,在幾家大廠的子品牌旗艦賣到3000元左右時,這

Vue開發建議:如何進行效能測試和效能調優 Vue開發建議:如何進行效能測試和效能調優 Nov 22, 2023 pm 12:01 PM

在Vue開發中,效能是一個非常重要的問題。如果我們能夠開發出性能出色的應用,對於用戶的用戶體驗和市場競爭力都有很大的提升。而要實現這一點,我們需要進行效能測試和效能調校。本文將介紹如何進行效能測試和效能調校。一、效能測試效能測試是提升應用效能的關鍵。它可以偵測出應用中造成效能問題的因素,進而最佳化。要進行效能測試,我們可以採用以下方法:1.基準測試基準測試是

Golang函數並發程式設計中效能測試的方法 Golang函數並發程式設計中效能測試的方法 Apr 17, 2024 pm 10:09 PM

在Go語言中,透過對函數進行並發調用,可以提高程式效能。為了評估這種效能提升,可以使用基準測試機制:基準測試:使用內建機制測量函數執行時間,例如funcBenchmarkConcurrentFunction。實戰案例:例如,對計算斐波那契數的函數進行並發效能測試,如funcBenchmarkFibonacciConcurrent。分析結果:基準測試可以顯示並發計算相對於串列運算的效能提升,如斐波那契數計算中快了約21,311奈秒。

See all articles