>웹 프론트엔드 >JS 튜토리얼 >eval_javascript 기술에 대한 두 가지 성능 테스트 데이터 세트

eval_javascript 기술에 대한 두 가지 성능 테스트 데이터 세트

WBOY
WBOY원래의
2016-05-16 17:50:41919검색

@老赵의 Weibo 게시물 "eval로 생성된 코드가 정말 비효율적인가요? http://t.cn/zWTUBEo 인신 공격이 포함되어 있습니다. 마음에 들지 않으면 입력하지 마세요.
최근 트리거되었습니다." 평가에 대한 열띤 토론 토론 중에 리더 @Franky와 Hui Da @otakustay도 훌륭한 데이터 분석을 제공했습니다.
저도 비슷한 테스트를 해본 적이 있어서 따라해서 재미있게 참여했고, 참고용으로 두 세트의 데이터를 제공했습니다.

업데이트 1: @otakustay의 지침 덕분에 eval('') 호출 자체가 결과에 미치는 영향을 제거하기 위해 새로운 데이터 세트 A3 및 B3이 추가되었습니다. 그리고 모든 이전 데이터를 다시 테스트하십시오.
업데이트 2: 강력한 Paizhuan에 대한 Mo Da @貘吃荍香 덕분에 1) A4, B4, B5 평가 2)의 테스트 데이터가 추가되었습니다. 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.79m
b.2 Firefox 14.0.1
b.3 IE9.0.8112.16421
d 테스트 방법
d. 1 각 사용 사례는 5번 테스트되며 최소 시간이 소요됩니다.
d.2 테스트 중에 Firebug 또는 Chrome 콘솔이 켜지지 않았습니다. 이러한 도구를 켜면 시간이 두 배로 늘어나 유효 시간 내에 이 사용 사례의 결과를 얻기가 어렵습니다.

사용 사례 A1:
함수

코드 복사 에서 빈 eval("")을 인라인으로 호출합니다. 코드는 다음과 같습니다.

!function () {
var a = 1,
b = 2,
c =
function func() {
var d = 2 ;
e = !c;
eval("");
}
for (var i = 0; i < 2999999; 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 < 2999999 ; 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 < 2999999; i ) {
eval("");
func(i, i 1, i 2 ; >
코드 복사


코드는 다음과 같습니다.


함수 eval(){}
!function() {
var a = 1,
b = 2,
c = true
function func() {
var d = 2 ;
e = !c;
사용 사례 A5:

또한 eval이 아닌 함수 호출이며 또 다른 빈 함수입니다. >



코드 복사


코드는 다음과 같습니다.


function f(){}
!function () {
var a = 1,
b = 2,
c = true
function func() {
var d = 2
e; 🎜>f("");
}
for (var i = 0; i < 2999999; i ) { func(i, i 1, i 2) }; >}(); 사용 사례 A6: 다른 변수 f에 eval을 할당한 다음 f를 호출합니다.



코드 복사


코드는 다음과 같습니다.


var f = eval
!function() {
var a = 1,
b = 2,
c = true;
function func() {
var d = 2
e = !c
}
(var i = 0; i < 2999999; 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 < 2999999; 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에서 초기화된다는 것입니다(블랙 박스 추론, 신뢰할 수 없음, 아마도 단지 추측). 현재 범위에 대한 변수입니다. 마찬가지로 eval은 인라인 기능에 대한 런타임 시 JS 엔진의 최적화 기능에 더 큰 영향을 미치고 실행 효율성을 감소시킵니다.

4. 여담으로 말하자면, IE10은 사용하지 않고 IE9을 사용하고 있지만 평가 처리 성능은 매우 좋습니다. IE는 항상 개발자들로부터 비난을 받아왔지만, 그 빠른 성장은 인정받을 가치가 있습니다.

이유에 대한 더 자세한 분석은 다음 기사의 설명이 매우 자세하므로 다시 반복하지 않습니다. 어서오세요 :) 특히 모다...

@老赵 《eval로 생성된 코드는 정말 비효율적인가요? 》
@Franky"Popular Science on Eval"
@otakustay"에 대한 간략한 이야기 평가의 영향"

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.