대용량 배열을 루핑하는 데 있어 JavaScript의 효율성은 만족스럽지 않습니다. VBS 배열과 비교했을 때 VBS의 배열 루프 속도는 JS( http://community.csdn.net/Expert/TopicView. asp?id=4313487 ). 우리는 일반 프로그래밍에서 JS 배열의 효율성에 큰 관심을 기울이지 않습니다. 수십 개의 요소만으로는 배열의 효율성을 알 수 없지만 노드 수가 수천 또는 수만과 같이 많습니다. 많은 양의 어레이 루프를 사용하는 경우 효율성 문제가 가장 먼저 고려해야 할 문제가 됩니다. 대용량 배열 검색에는 일반적으로 콤보 상자 선택 시 빠른 매칭, 트리 쿼리, 테이블 정렬 또는 검색 등의 용도가 있습니다.
테스트를 해보겠습니다. 먼저 대용량 배열을 만듭니다.
<SCRIPT LANGUAGE="JavaScript">
var n = 100000; //배열의 최대 용량
var a = 새로운 배열();
for(var i=0; i<n; i++)
{
a[i] = Math.random() +"";
}
</SCRIPT>
이런 식으로 길이가 100000인 문자 배열을 만든 다음 0.9999로 시작하는 문자열을 검색하여 다른 배열에 저장했습니다.
<SCRIPT LANGUAGE="자바스크립트">
var n = 100000; //배열의 최대 용량
var a = 새로운 배열();
for(var i=0; i<n; i++)
{
a[i] = Math.random() +"";
}
var start = new Date().getTime();
var b = 새로운 배열();
for(var i=0; i<n; i++)
{
if(a[i].indexOf("0.9999")==0)
{
b[b.길이] = a[i];
}
}
document.write("배열 길이: "+ n);
document.write("<br>기존 루프 방법은 시간이 걸립니다." + (new Date().getTime() - 시작)
+" 밀리초! 검색 결과: <strong title='"+ b.join(" ")
+"'>"+ b.length +" 레코드를 검색했습니다!</strong>");
</SCRIPT>
여기서의 작업 단계는 약 2800밀리초가 소요됩니다. 설명하자면 여기의 루프는 if 판단과 할당 작업만 있으면 매우 간단합니다. 시간이 더 많이 걸릴 것입니다. 그렇다면 이 문제에 대한 좋은 최적화 솔루션이 있습니까? 대답은 물론 그렇습니다. 그렇지 않으면 제가 이 게시물에서 말하고 싶은 것은 모두 말 낭비가 될 것입니다. 그러나 우리는 이 문제를 최적화하기 위해 더 이상 전통적인 사고 방식을 사용할 수 없습니다. 왜냐하면 전통적인 사고 방식에서는 더 나은 글쓰기 방법을 찾을 수 없기 때문입니다.
해결책은 먼저 배열을 큰 문자열로 조인()한 다음 정규식을 사용하여 큰 문자열을 일치시키고 검색하는 것입니다. 이 방법은 저의 개인적인 독창성이라고 볼 수 있습니다. 트리를 작성하는 과정에서 삐뚤어진 트릭을 생각해냈는데, 효율성은 정말 나쁘지 않습니다. 나는 이미 Join()의 효율성에 대해 논의했습니다( http://blog.csdn.net/meizz/archive/2005/12/14/552260.aspx JavaScript Speed: The Efficiency of Combining and Splicing Strings). 이 최적화 계획에는 일정 수준의 정규식 기술이 필요합니다.
<input id="count" value="50000" size="7" maxlength="6">
<input type="button" value="배열 초기 Hua" onclick="txt.innerHTML = array_init()"><br>
<input type="button" value="기존 루프" onclick="txt.innerHTML += method_for()">
<input type="button" value="정규 매칭" onclick="txt.innerHTML += method_regexp()">
<div id="txt"></div>
<SCRIPT LANGUAGE="JavaScript">
var txt = document.getElementById("txt");
var a = 새로운 배열();
함수 array_init()
{
var n = parsInt(document.getElementById("count").value);
a.길이 = 0;
for(var i=0; i<n; i++)
{
a[i] = Math.random() +"";
}
"배열 길이: "+ n을 반환합니다.
}
함수 method_for()
{
var n = a.길이;
var start = new Date().getTime();
var b = 새로운 배열();
for(var i=0; i<n; i++)
{
if(a[i].indexOf("0.9999")==0)
{
b[b.길이] = a[i];
}
}
return ("<br>기존 루프 방법은 시간이 걸립니다." + (new Date().getTime() - 시작)
+" 밀리초! 검색 결과: <strong title='"+ b.join(" ")
+"'>"+ b.length +" 레코드를 검색했습니다!</strong>");
}
함수 method_regexp()
{
var start = new Date().getTime();
var b = 새로운 배열();
var s = a.join("x0f");
var r = new RegExp().compile("0\.9999\d+", "g");
b = s.match(r); s = "";
return ("<br>일반적인 일치 방법은 시간이 걸립니다." + (new Date().getTime() - 시작)
+" 밀리초! 검색 결과: <strong title='"+ b.join(" ")
+"'>"+ b.length +" 레코드를 검색했습니다!</strong>");
}
</SCRIPT>
위의 두 가지 방법의 효율성 차이가 얼마나 되는지 테스트해 볼 수 있습니다! 코드는 죽었고, 사람은 살아있습니다. 생각이나 모델을 바꾸면 효율성이 매우 달라집니다.
이 트릭을 고안하는 데 많은 노력이 필요했고, 이제 이 트릭을 사용하여 2006년 새해를 맞이하는 모든 사람을 축하하겠습니다.