eval的两组性能测试数据_javascript技巧
@老赵 的一个微博“ 由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 |
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的影响》

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Cara menggunakan Docker untuk ujian prestasi dan ujian tekanan kontena memerlukan contoh kod khusus Pengenalan Peningkatan teknologi virtualisasi kontena telah menjadikan penggunaan dan pengendalian aplikasi lebih fleksibel dan cekap, dan salah satu alat yang paling popular ialah Docker. Sebagai platform kontena yang ringan, Docker menyediakan cara yang mudah untuk membungkus, mengedar dan menjalankan aplikasi, tetapi bagaimana untuk menguji dan menilai prestasi kontena, terutamanya ujian tekanan di bawah keadaan beban tinggi, Ia adalah persoalan yang ramai orang bimbang. Artikel ini akan memperkenalkan

eval的意思是“评估”,是python中的一个内置函数,用于执行一个字符串表达式,并返回表达式的计算结果;即变量赋值时,等号右边的表示是写成字符串的格式,返回值就是这个表达式的结果。语法“eval(表达式[, globals[, locals]])”。

Ujian prestasi menilai prestasi aplikasi di bawah beban yang berbeza, manakala ujian unit mengesahkan ketepatan satu unit kod. Ujian prestasi memfokuskan pada mengukur masa tindak balas dan daya pemprosesan, manakala ujian unit memfokuskan pada output fungsi dan liputan kod. Ujian prestasi mensimulasikan persekitaran dunia sebenar dengan beban tinggi dan serentak, manakala ujian unit dijalankan di bawah beban rendah dan keadaan bersiri. Matlamat ujian prestasi adalah untuk mengenal pasti kesesakan prestasi dan mengoptimumkan aplikasi, manakala matlamat ujian unit adalah untuk memastikan ketepatan dan keteguhan kod.

Gambaran keseluruhan ujian prestasi mengimbangi beban Nginx dan amalan penalaan: Sebagai pelayan proksi songsang berprestasi tinggi, Nginx sering digunakan dalam senario aplikasi pengimbangan beban. Artikel ini akan memperkenalkan cara melakukan ujian prestasi pengimbangan beban Nginx dan meningkatkan prestasinya melalui amalan penalaan. Penyediaan ujian prestasi: Sebelum melaksanakan ujian prestasi, kami perlu menyediakan satu atau lebih pelayan dengan prestasi yang baik, memasang Nginx dan mengkonfigurasi proksi terbalik dan pengimbangan beban. Pemilihan alat ujian: Untuk mensimulasikan keadaan beban sebenar, kita boleh menggunakan biasa

Bagaimana untuk mencapai pengoptimuman asas MySQL: Penggunaan dan analisis lanjutan bagi ujian prestasi dan alat penalaan Pengenalan MySQL ialah sistem pengurusan pangkalan data hubungan yang biasa digunakan yang digunakan secara meluas dalam pelbagai aplikasi Web dan sistem perisian yang besar. Untuk memastikan kecekapan operasi dan prestasi sistem, kami perlu melaksanakan pengoptimuman asas MySQL. Artikel ini menerangkan cara menggunakan alat ujian dan penalaan prestasi untuk penggunaan dan analisis lanjutan serta menyediakan contoh kod khusus. 1. Pemilihan dan penggunaan alat ujian prestasi Alat ujian prestasi adalah penting untuk menilai prestasi sistem dan kesesakan

Perlu dikatakan bahawa dalam pasaran telefon mudah alih yang semakin homogen ini, Red Magic sememangnya kewujudan yang agak unik dan luar biasa. Walaupun keseluruhan kategori telefon permainan sedang bergelut disebabkan nisbah penggunaan tenaga yang dipertingkatkan Qualcomm Snapdragon, Red Devils sentiasa mematuhi set konsep produk mereka sendiri, dengan badan lurus dan pelesapan haba yang aktif, yang mereka inginkan hanyalah pelepasan prestasi. . Apabila keseluruhan telefon mudah alih utama industri semakin merosot disebabkan pengumpulan berterusan modul pengimejan, Red Devils sebenarnya memberikan anda reka bentuk kamera belakang yang rata Ini malah mungkin menjadi trend pertama dalam keseluruhan industri telefon bimbit pada masa lalu empat atau lima tahun Satu-satunya produk di pasaran. (Sumber: Red Devils) Perkara yang paling penting ialah, sebagai tuan kepada pendapat netizen, Red Devils telah benar-benar berjaya menarik sekumpulan peminat Apabila sub-jenama utama beberapa pengeluar utama menjual sekitar 3,000 yuan, ini

Cara melumpuhkan eval dalam PHP di bawah win: 1. Muat turun "PHP_diseval_extension" 2. Cari PHP yang sedang digunakan oleh pelayan 3. Buka fail konfigurasi PHP 4. Tambah kod "extension=diseval.so"; Mulakan semula perkhidmatan.

Dalam pembangunan Vue, prestasi adalah isu yang sangat penting. Jika kita boleh membangunkan aplikasi dengan prestasi cemerlang, pengalaman pengguna dan daya saing pasaran akan bertambah baik. Untuk mencapai matlamat ini, kita perlu melakukan ujian prestasi dan penalaan prestasi. Artikel ini akan memperkenalkan cara melakukan ujian prestasi dan penalaan prestasi. 1. Ujian prestasi Ujian prestasi adalah kunci untuk meningkatkan prestasi aplikasi. Ia boleh mengesan faktor yang menyebabkan masalah prestasi dalam aplikasi dan kemudian mengoptimumkannya. Untuk menjalankan ujian prestasi, kita boleh menggunakan kaedah berikut: 1. Ujian penanda aras Ujian penanda aras ialah
