ประสิทธิภาพของ JavaScript ในการวนซ้ำอาร์เรย์ความจุขนาดใหญ่ นั้น ไม่น่าพอใจ ครั้งหนึ่งฉันเคยทำการเปรียบเทียบ asp?id=4313487 ) เราไม่ได้ใส่ใจกับประสิทธิภาพของอาร์เรย์ JS ในการเขียนโปรแกรมทั่วไปมากนัก: คุณไม่สามารถบอกประสิทธิภาพของอาร์เรย์ด้วยองค์ประกอบเพียงไม่กี่โหลได้ด้วยซ้ำ แต่จำนวนโหนดมีขนาดใหญ่ เช่น หลายพันหรือหลายหมื่น ของโหนด หากใช้อาร์เรย์ลูปจำนวนมาก ปัญหาด้านประสิทธิภาพจะกลายเป็นปัญหาหลักที่ต้องพิจารณา โดยทั่วไปการดึงข้อมูลอาร์เรย์ความจุสูงจะมีแอปพลิเคชันต่อไปนี้: การจับคู่อย่างรวดเร็วเมื่อเลือกกล่องคำสั่งผสม การสืบค้นแบบต้นไม้ การเรียงลำดับหรือการเรียกข้อมูลตาราง ฯลฯ
ให้ฉันทำการทดสอบ ก่อนอื่น ฉันสร้างอาร์เรย์ความจุสูง:
<SCRIPT LANGUAGE="JavaScript">
var n = 100,000; //ความจุสูงสุดของอาร์เรย์
var a = อาร์เรย์ใหม่ ();
สำหรับ (var i=0; i<n; i++)
-
a[i] = Math.random() +"";
-
</SCRIPT>
ด้วยวิธีนี้ ฉันสร้างอาร์เรย์อักขระที่มีความยาว 100,000 จากนั้นดึงสตริงที่เริ่มต้นด้วย 0.9999 และเก็บไว้ในอาร์เรย์อื่น
<SCRIPT LANGUAGE="จาวาสคริปต์">
var n = 100,000; //ความจุสูงสุดของอาร์เรย์
var a = อาร์เรย์ใหม่ ();
สำหรับ (var i=0; i<n; i++)
-
a[i] = Math.random() +"";
}
var start = วันที่ใหม่().getTime();
var b = อาร์เรย์ใหม่ ();
สำหรับ (var i=0; i<n; i++)
-
ถ้า(a[i].indexOf("0.9999")==0)
-
b[b.ความยาว] = a[i];
-
-
document.write("ความยาวอาร์เรย์: "+ n);
document.write("<br>วิธีวนซ้ำแบบดั้งเดิมต้องใช้เวลา" + (new Date().getTime() - start)
+" มิลลิวินาที! ผลการสืบค้น: <strong title='"+ b.join(" ")
+"'>ดึงข้อมูลบันทึก "+ b.length +" แล้ว!</strong>");
</SCRIPT>
ขั้นตอนการดำเนินการนี้ใช้เวลาประมาณ 2800 มิลลิวินาที เพื่ออธิบาย การวนซ้ำที่นี่ง่ายมาก มันจะต้องใช้เวลามากขึ้น มีวิธีแก้ไขปัญหาการเพิ่มประสิทธิภาพที่ดีสำหรับปัญหานี้หรือไม่? คำตอบคือใช่ ไม่เช่นนั้นทั้งหมดที่ฉันจะพูดในโพสต์นี้คงเป็นการสิ้นเปลืองคำพูด แต่เราไม่สามารถใช้การคิดแบบเดิมของเราเพื่อเพิ่มประสิทธิภาพปัญหานี้ได้อีกต่อไป เนื่องจากไม่มีวิธีการเขียนที่ดีไปกว่านี้ในการคิดแบบดั้งเดิม
วิธีแก้ไขคือ ขั้นแรกให้รวมอาร์เรย์เข้ากับสตริงขนาดใหญ่ จากนั้นใช้นิพจน์ทั่วไปเพื่อจับคู่และดึงข้อมูลสตริงขนาดใหญ่ วิธีการนี้ถือได้ว่าเป็นความคิดริเริ่มส่วนตัวของฉัน ฉันคิดเคล็ดลับที่คดเคี้ยวระหว่างขั้นตอนการเขียนต้นไม้ แต่ประสิทธิภาพก็ไม่เลวเลย ฉันได้พูดคุยถึงประสิทธิภาพของ 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="Array Initial 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 = parseInt(document.getElementById("count").value);
ก.ความยาว = 0;
สำหรับ (var i=0; i<n; i++)
-
a[i] = Math.random() +"";
-
กลับ "ความยาวอาร์เรย์:"+ n;
}
ฟังก์ชั่น method_for()
-
var n = a.length;
var start = new Date().getTime();
var b = อาร์เรย์ใหม่ ();
สำหรับ (var i=0; i<n; i++)
-
ถ้า(a[i].indexOf("0.9999")==0)
-
b[b.ความยาว] = a[i];
-
-
return ("<br>วิธีวนซ้ำแบบดั้งเดิมต้องใช้เวลา" + (new Date().getTime() - start)
+" มิลลิวินาที! ผลการดึงข้อมูล: <strong title='"+ b.join(" ")
+"'>ดึงข้อมูลบันทึก "+ b.length +" แล้ว!</strong>");
}
ฟังก์ชัน method_regexp()
-
var start = new Date().getTime();
var b = อาร์เรย์ใหม่ ();
var s = a.join("x0f");
var r = RegExp ใหม่().compile("0\.9999\d+", "g");
b = s.match(r); s = "";
return ("<br>วิธีจับคู่แบบปกติต้องใช้เวลา" + (new Date().getTime() - start)
+" มิลลิวินาที! ผลการสืบค้น: <strong title='"+ b.join(" ")
+"'>ดึงข้อมูลบันทึก "+ b.length +" แล้ว!</strong>");
-
</SCRIPT>
คุณสามารถทดสอบเพื่อดูว่าประสิทธิภาพที่แตกต่างกันระหว่างสองวิธีข้างต้นคือเท่าใด! รหัสตายแล้ว ผู้คนยังมีชีวิตอยู่ หากคุณเปลี่ยนความคิดหรือแบบจำลอง ประสิทธิภาพจะแตกต่างออกไปมาก
ฉันต้องใช้สมองอย่างมากในการคิดเคล็ดลับนี้ และฉันไม่กล้าแบ่งปันเลย ตอนนี้ฉันจะใช้มันเพื่อแสดงความยินดีกับทุกคนในการเริ่มต้นปีใหม่ 2549