ホームページ >ウェブフロントエンド >jsチュートリアル >eval_javascript スキル用の 2 セットのパフォーマンス テスト データ

eval_javascript スキル用の 2 セットのパフォーマンス テスト データ

WBOY
WBOYオリジナル
2016-05-16 17:50:41917ブラウズ

@老赵による Weibo の投稿「eval によって生成されたコードは本当に非効率ですか? http://t.cn/zWTUBEo 個人攻撃が含まれています。気に入らない場合は入力しないでください。
が最近の投稿を引き起こしました。」 eval についての白熱した議論 ディスカッションでは、リーダーの @Franky と Hui Da @otakustay も素晴らしいデータ分析を行いました。
私もたまたま以前に同様のテストを行ったことがあったので、それに倣って楽しみに参加し、参考のために 2 セットのデータを提供しました。

更新 1: @otakustay の指導のおかげで、結果に対する eval('') 呼び出し自体の影響を排除するために、新しいデータ セット A3 と B3 が追加されました。そして古いデータをすべて再テストします。
更新 2: Mo Da @貘吃荍香の強力な Paizhuan に感謝します。A4、B4、B6 の評価後のテスト データ 3)。 A7、B7 評価呼び出し。

テスト環境:
a. マシン: Intel(R) Corei7-2720 2.2Ghz (4 コア 8 スレッド)、メモリ 8Gb
b. OS: Windows 7 Enterprise SP1 64 ビット
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 コンソールがテスト中にオンになっていなかったため、これらのツールをオンにすると時間が 2 倍になり、有効時間内にこのユースケースの結果を取得することが困難になります。

ユースケース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;
関数 func() {
e = !c;
; 🎜>for (var i = 0; i func(i, i 1, i 2)
}
}(); >ユースケース A3:
は eval("" を除外します) 呼び出し自体の影響で、外部関数で eval("") を呼び出します




コードをコピーします

コードは次のとおりです:


!function() {
var a = 1, b = 2, c = true ; 関数 func() { var d = 2; e = !c; for (var i = 0; i eval("");
func(i, i 1, i 2 ; >
コードをコピーします


コードは次のとおりです:


関数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,
関数 func() {
var d = 2; 🎜>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;
関数 func() {
e = ! c; (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 < 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 がオーバーライドされた空関数であっても、すべての外部定義変数とその他の内容はスコープで初期化されるということです。現在のスコープへの変数。同様に、eval はインライン関数の実行時に JS エンジンの最適化機能に大きな影響を与え、実行効率を低下させます。

4. 余談ですが、IE10は使用していませんが、IE9を使用していますが、eval処理のパフォーマンスは非常に優れています。 IE は常に開発者から批判されてきましたが、その急速な成長は評価に値します。この例はその良い証拠です。

理由の詳細な分析については、次の記事で詳しく説明されているため、繰り返しません。ようこそ:) 特にMo Da...

@老赵《eval によって生成されたコードは本当に非効率ですか? 》
@Franky「ポピュラー・サイエンス・オン・エヴァル」
@otakustay「A Brief Talk on Eval」 Eval の影響"

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。