2014 While
กลับมาแล้ว
แค่คิดอย่างมีเหตุผล
ดูนี่สิ
for( var index = 0 , length = array.length ; index < length ; index++ ) {
//do stuff
}
- จำเป็นต้องสร้างตัวแปรอย่างน้อย 2 ตัว (ดัชนีความยาว)
- จำเป็นต้องตรวจสอบว่าดัชนีมีขนาดเล็กกว่าความยาวหรือไม่
- จำเป็นต้องเพิ่มดัชนี
for
ห่วงมี 3 พารามิเตอร์
ตอนนี้บอกฉันหน่อยว่าทำไมเรื่องนี้ถึงเร็วกว่า:
var length = array.length;
while( --length ) { //or length--
//do stuff
}
- ตัวแปรเดียว
- ไม่มีการตรวจสอบ
- ดัชนีจะลดลง (เครื่องจักรต้องการมากกว่านั้น)
while
มีพารามิเตอร์เดียวเท่านั้น
ฉันสับสนอย่างสิ้นเชิงเมื่อ Chrome 28 แสดงให้เห็นว่าการวนซ้ำเร็วกว่าในขณะนั้น นี่ต้องมีอะไรบางอย่าง
"เอ่อทุกคนกำลังใช้ลูปเพื่อให้เรามุ่งเน้นไปที่การพัฒนาสำหรับโครเมี่ยม"
แต่ตอนนี้ในปี 2014 ขณะที่วงกลับมาที่โครเมียม มันเร็วกว่า 2 เท่าบนเบราว์เซอร์อื่น / เก่ากว่ามันเร็วกว่าเสมอ
เมื่อเร็ว ๆ นี้ฉันได้ทำการทดสอบใหม่ ตอนนี้ในโลกแห่งความเป็นจริงการกำหนดรหัสสั้น ๆ เหล่านี้ไม่มีค่าอะไรเลยและ jsperf ไม่สามารถทำงานได้อย่างถูกต้องในขณะที่ลูปเพราะมันจำเป็นต้องสร้าง array.length อีกครั้งซึ่งต้องใช้เวลา
คุณไม่สามารถรับความเร็วจริงของการวนรอบบน jsperf
คุณต้องสร้างฟังก์ชั่นที่กำหนดเองของคุณเองและตรวจสอบด้วย window.performance.now()
และใช่ ... ไม่มีวิธีใดในขณะที่การวนซ้ำนั้นเร็วขึ้น
ปัญหาที่แท้จริงคืออันที่จริงแล้วการจัดการ / การแสดงเวลา / เวลาการวาดหรือคุณต้องการเรียกมันว่า
ตัวอย่างเช่นฉันมีฉากผ้าใบที่ฉันต้องการคำนวณพิกัดและการชน ... ซึ่งจะทำระหว่าง 10-200 MicroSeconds (ไม่ใช่มิลลิวินาที) ใช้เวลาหลายมิลลิวินาทีในการแสดงทุกอย่างเหมือนกันใน DOM
แต่
มีอีกวิธี Super Performant ใช้สำหรับloop
ในในบางกรณี ... ตัวอย่างเช่นการคัดลอก / โคลนอาร์เรย์
for(
var i = array.length ;
i > 0 ;
arrayCopy[ --i ] = array[ i ] // doing stuff
);
สังเกตการตั้งค่าพารามิเตอร์:
- เหมือนกับในขณะที่ลูปฉันใช้ตัวแปรเดียวเท่านั้น
- ต้องตรวจสอบว่าดัชนีใหญ่กว่า 0 หรือไม่
- อย่างที่คุณเห็นว่าวิธีนี้แตกต่างจากปกติสำหรับลูปที่ทุกคนใช้เพราะฉันทำสิ่งต่าง ๆ ในพารามิเตอร์ที่ 3 และฉันก็ลดลงโดยตรงภายในอาเรย์
กล่าวว่าสิ่งนี้เป็นการยืนยันว่าเครื่องจักรเช่น -
เขียนว่าฉันคิดว่าจะทำให้สั้นลงเล็กน้อยและลบสิ่งที่ไร้ประโยชน์ออกและเขียนสิ่งนี้โดยใช้สไตล์เดียวกัน:
for(
var i = array.length ;
i-- ;
arrayCopy[ i ] = array[ i ] // doing stuff
);
แม้ว่ามันจะสั้นกว่า แต่ดูเหมือนว่าการใช้i
อีกครั้งจะช้าลงทุกอย่าง มัน 1/5 ช้ากว่าก่อนหน้านี้for
วงและwhile
หนึ่ง
หมายเหตุ:;
เป็นสิ่งสำคัญมากหลังจากที่สำหรับ looo โดยไม่ต้อง{}
แม้ว่าฉันเพิ่งจะบอกคุณว่า jsperf ไม่ใช่วิธีที่ดีที่สุดในการทดสอบสคริปต์ .. ฉันได้เพิ่ม 2 ลูปที่นี่
http://jsperf.com/caching-array-length/40
และนี่คือคำตอบเกี่ยวกับประสิทธิภาพใน javascript อีกประการหนึ่ง
https://stackoverflow.com/a/21353032/2450730
คำตอบนี้คือการแสดงวิธีการเขียนจาวาสคริปต์ ดังนั้นหากคุณไม่สามารถอ่านได้ให้ถามและคุณจะได้รับคำตอบหรืออ่านหนังสือเกี่ยวกับ javascript http://www.ecma-international.org/ecma-262/5.1/