function func2(){ var obj = document.getElementById("demo") var start = new Date().getTime(); 🎜>var arr = []; for(var i = 0; i < 100; i ){ arr[i] = str i } obj.innerHTML = arr. Join("");
넷째, 범위 체인에서 검색 횟수를 줄입니다. 여러 페이지 값을 사용하는 경우 문서 개체를 정의한 다음 이 개체를 호출합니다.
var doc = document for; (var i = 0; i < 10000; i ){ var but1 = doc.getElementById("but1"); var but2 = doc.getElementById("but2") var inputs = doc.getElementsByTagName("input"); } }
5. 이중 해석 방지: 함수나 메소드를 반복적으로 호출하지 마세요
1. 문자열 접합
우리 개발에서는 문자열 접합이 자주 발생하므로 먼저 =를 사용하여 문자열을 접합하는 데 익숙합니다. 실제로 이 접합 방법은 매우 비효율적입니다. 배열의 조인 방법.
//비효율적 function func1(){ var start = new Date().getTime() var template = ""; for(var i = 0; i < 10000; i ){ template = ""; } var end = new Date().getTime(); document.getElementById("one").innerHTML = template; alert("걸린 시간:" (end - start) "밀리초" ); } //효율적 function func2(){ var start = new Date().getTime() var array = [] for(var) i = 0; i < 10000; i ){ array[i] = "" } var end = new Date ().getTime(); document.getElementById("one").innerHTML = array.join(""); alert("걸린 시간:" (끝 - 시작) "밀리초"); 🎜 >}
다른 브라우저에서 어떻게 작동하는지 살펴보겠습니다
IE6에서는 차이가 매우 분명하다는 것을 알 수 있습니다. 실제로 이러한 상황은 IE의 상위 버전에서도 매우 분명하지만, 반대로 Firefox에서는 큰 차이가 없습니다. 더 낮지만 그 차이는 2ms 정도에 불과하고, 크롬은 파이어폭스와 비슷합니다. 그런데 배열에 요소를 추가할 때 push라는 기본 방식을 선호하는 분들이 많습니다. 실제로는 arr[i]나 arr[arr.length]를 직접 사용하는 것이 더 빠릅니다. 10000. 다중 루프의 경우 IE 브라우저에서는 10밀리초 이상의 차이가 발생합니다.
var arr2 = []; for(var i = 0; i < 10000; i ){ arr2[i] = "
" i "
" } //비효율적 function func1(){ var start = new Date().getTime(); for(var i = 0; i < arr2.length; i ){ //"낮은 효율성 " } var end = new Date().getTime(); alert("걸린 시간:" (end - start) "밀리초"); } //매우 효율적 function func2(){ var start = new Date().getTime() for(var i = 0, len = arr2.length; i < len; i ){ / /"고효율" } var end = new Date().getTime() alert("걸린 시간:" (end - start) "밀리초");
위 표에서 볼 수 있듯이 그냥 배열이라면 두 가지 작성 방법이 거의 동일하다는 것을 알 수 있습니다. 실제로 루프를 100,000배로 늘려도 그 차이는 몇 배에 불과합니다. milliseconds 이므로 배열의 경우에는 다 똑같은 것 같아요. for 루프의 최적화에 관해서도 어떤 사람들은 많은 점을 제시했는데, 어떤 사람들은 -=1을 사용하거나 큰 것에서 작은 것으로 반복하는 등의 것이 전혀 반영되지 않는 경우가 많다고 생각합니다. 한마디로 컴퓨터 수준에서는 작은 변화일 뿐이지만 코드의 가독성이 크게 떨어지므로 실제로 손실을 볼 가치는 없습니다.
3. 페이지 다시 그리기 줄이기
페이지 다시 그리기를 줄이는 것은 본질적으로 JS 자체의 최적화는 아니지만 JS로 인해 발생하는 경우가 많고 다시 그리기가 페이지 성능에 심각한 영향을 미치는 경우가 많기 때문에 반드시 제거해야 합니다.
;"; //비효율적 function func1(){ var obj = document.getElementById("demo"); var start = new Date().getTime(); for(var i = 0; i < 100; i ){ obj.innerHTML = str i } var end = new Date().getTime() alert(" 시간"(끝 - 시작) "밀리초"); } //효율성 높음 function func2(){ var obj = document.getElementById("demo"); var start = new Date().getTime(); var arr = [] for(var i = 0; i < 100; i ){ arr[i] = str i; 🎜>} obj.innerHTML = arr.join(""); var end = new Date().getTime() alert("걸린 시간" (종료 - 시작) " 밀리초" ); }
예제에서는 100번의 루프를 사용했습니다. 10,000번의 루프를 사용하면 기본적으로 브라우저가 정지되기 때문입니다. 100번의 루프이므로 아래의 실행 결과를 살펴보겠습니다.
보시다시피 이것은 놀라운 결과입니다. 어떤 브라우저에서든 상관없이 실행 효율성이 실제로 많이 다릅니다. Firefox보다 낫습니다. Firefox는 페이지 다시 그리기에서 어떤 최적화도 수행하지 않았음을 알 수 있습니다. 일반적으로 페이지 다시 그리기에 영향을 미치는 것은 innerHTML 뿐만이 아니라는 점에 유의해야 합니다. 요소의 스타일, 위치 등을 변경하면 페이지 다시 그리기가 트리거되므로 평소에는 이에 주의해야 합니다.
4. 범위 체인의 조회 수를 줄입니다.
js 코드가 실행될 때 변수나 함수에 액세스해야 하는 경우 현재 실행 환경의 범위 체인을 순회해야 하며 순회는 다음과 같이 이 범위 체인 수준의 프런트 엔드에서 시작된다는 것을 알고 있습니다. 전역 실행 환경까지 역순회하므로 여기서는 상황이 자주 발생합니다. 즉, 전역 환경의 변수 개체에 자주 액세스해야 하는 경우 매번 현재 범위 체인에서 수준별로 순회해야 합니다. 다음 예를 살펴보겠습니다.
function func1(){ var start = new Date().getTime(); for(var i = 0; i < 10000; i ){ var but1 = document.getElementById("but1"); var but2 = document.getElementById("but2"); var inputs = document.getElementsByTagName("input"); var divs = document.getElementsByTagName("div"); var but1 = document.getElementById("but1"); var but2 = document.getElementById("but2"); var inputs = document.getElementsByTagName("input"); var divs = document.getElementsByTagName("div"); var but1 = document.getElementById("but1"); var but2 = document.getElementById("but2"); var inputs = document.getElementsByTagName("input"); var divs = document.getElementsByTagName("div"); var but1 = document.getElementById("but1"); var but2 = document.getElementById("but2"); var inputs = document.getElementsByTagName("input"); var divs = document.getElementsByTagName("div"); var but1 = document.getElementById("but1"); var but2 = document.getElementById("but2"); var inputs = document.getElementsByTagName("input"); var divs = document.getElementsByTagName("div"); var but1 = document.getElementById("but1"); var but2 = document.getElementById("but2"); var inputs = document.getElementsByTagName("input"); var divs = document.getElementsByTagName("div"); } var end = new Date().getTime(); alert("사용时 "(종료 - 시작) " 毫秒"); } function func2(){ var start = new Date().getTime(); var doc = 문서; for(var i = 0; i < 10000; i ){ var but1 = doc.getElementById("but1"); var but2 = doc.getElementById("but2"); var inputs = doc.getElementsByTagName("input"); var divs = doc.getElementsByTagName("div"); var but1 = doc.getElementById("but1"); var but2 = doc.getElementById("but2"); var inputs = doc.getElementsByTagName("input"); var divs = doc.getElementsByTagName("div"); var but1 = doc.getElementById("but1"); var but2 = doc.getElementById("but2"); var inputs = doc.getElementsByTagName("input"); var divs = doc.getElementsByTagName("div"); var but1 = doc.getElementById("but1"); var but2 = doc.getElementById("but2"); var inputs = doc.getElementsByTagName("input"); var divs = doc.getElementsByTagName("div"); var but1 = doc.getElementById("but1"); var but2 = doc.getElementById("but2"); var inputs = doc.getElementsByTagName("input"); var divs = doc.getElementsByTagName("div"); var but1 = doc.getElementById("but1"); var but2 = doc.getElementById("but2"); var inputs = doc.getElementsByTagName("input"); var divs = doc.getElementsByTagName("div"); } var end = new Date().getTime(); alert("사용时 "(종료 - 시작) " 毫秒"); }
var sum, num1 = 1, num2 = 2; 🎜>function func1(){ var start = new Date().getTime(); for(var i = 0; i < 10000; i ){ var func = new Function(" sum =num1;num1 =num2;num2 ;"); func(); } var end = new Date().getTime(); alert("time" (end - start) " 밀리초"); }
function func2(){ var start = new Date().getTime() for(var i = 0; i < 10000; i ){ sum =num1; num2 ; } var end = new Date().getTime() alert("시간 " (end - start) " milliseconds"); }
첫 번째 경우에는 이중 해석을 위해 new Function을 사용하고, 두 번째 경우에는 이중 해석을 피합니다. 살펴보세요. 다양한 브라우저에서의 성능:
보시다시피 모든 브라우저에서 이중 해석은 오버헤드가 많이 발생하므로 실제로는 이중 해석을 최대한 피해야 합니다.
테스트 보고서 4번째 오류를 수정해주신 "SeaSunK"님께 감사드립니다. 마지막으로 func1은 매번 초기화되는데, 이는 비교할 수 없는 부분이라 eval로 변경해 보았는데, IE6.0에서는 여전히 영향을 미치는 것으로 나타났고, Firefox에서는 eval을 사용하는 것이 효율성에 미치는 영향은 균일합니다. Firefox에서는 10,000번 반복하면 10초 이상이 소요되므로 루프를 1,000번으로 변경했습니다. 코드와 보고서를 살펴보세요.
var start = new Date().getTime() for(var i = 0; i < 1000; i ){ eval("sum =num1; num1 =num2;num2 ;"); } var end = new Date().getTime(); alert("Time" (end - start) " 밀리초"); } function func2(){ var start = new Date().getTime() for(var i = 0; i < 1000; i ){ sum =num1 ; num1 =num2; num2 ; } var end = new Date().getTime() alert("시간"(끝 - 시작) "밀리초") }
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.