@老赵による 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("") をインライン化します
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 | 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 の影響"