ฉันพยายามที่จะให้ภาพกว้างกับคำตอบนี้
ความคิดในวงเล็บต่อไปนี้คือความเชื่อของฉันจนกระทั่งฉันเพิ่งทดสอบปัญหานี้เมื่อไม่นานมานี้:
[[ในแง่ของภาษาระดับต่ำเช่นC / C ++โค้ดจะถูกคอมไพล์เพื่อให้โปรเซสเซอร์มีคำสั่ง jump แบบมีเงื่อนไขพิเศษเมื่อตัวแปรเป็นศูนย์ (หรือไม่ใช่ศูนย์)
นอกจากนี้หากคุณสนใจเกี่ยวกับการเพิ่มประสิทธิภาพมากคุณสามารถไป++i
แทนได้i++
เพราะ++i
เป็นคำสั่งของตัวประมวลผลเดียวโดยที่i++
หมายความว่าj=i+1, i=j
]]
การวนซ้ำเร็วมากสามารถทำได้โดยการคลี่ออก:
for(i=800000;i>0;--i)
do_it(i);
มันอาจช้ากว่า
for(i=800000;i>0;i-=8)
{
do_it(i); do_it(i-1); do_it(i-2); ... do_it(i-7);
}
แต่เหตุผลสำหรับสิ่งนี้อาจค่อนข้างซับซ้อน (เพียงแค่พูดถึงมีปัญหาของการประมวลผลคำสั่งประมวลผลล่วงหน้าและการจัดการแคชในเกม)
ในแง่ของภาษาระดับสูงเช่นJavaScriptตามที่คุณถามคุณสามารถปรับสิ่งต่าง ๆ ได้หากคุณต้องพึ่งพาไลบรารีฟังก์ชันในตัวสำหรับการวนซ้ำ ให้พวกเขาตัดสินใจว่าจะทำอย่างไรดีที่สุด
ดังนั้นใน JavaScript ฉันขอแนะนำให้ใช้สิ่งที่ต้องการ
array.forEach(function(i) {
do_it(i);
});
นอกจากนี้ยังมีข้อผิดพลาดน้อยและเบราว์เซอร์มีโอกาสเพิ่มประสิทธิภาพรหัสของคุณ
[หมายเหตุ: ไม่เพียง แต่เบราว์เซอร์ แต่คุณก็มีพื้นที่สำหรับเพิ่มประสิทธิภาพได้อย่างง่ายดายเพียงแค่กำหนดforEach
ฟังก์ชันใหม่(เบราว์เซอร์พึ่งพา) เพื่อให้มันใช้กลอุบายที่ดีที่สุดล่าสุด! @AMK :) กล่าวว่าในกรณีพิเศษมันมีมูลค่าค่อนข้างใช้หรือarray.pop
array.shift
หากคุณทำเช่นนั้นให้วางไว้หลังม่าน overkill สูงสุดคือการเพิ่มตัวเลือกในการforEach
เลือกขั้นตอนวิธีการวนลูป.]
ยิ่งไปกว่านั้นสำหรับภาษาระดับต่ำแนวทางปฏิบัติที่ดีที่สุดคือการใช้ฟังก์ชั่นห้องสมุดอัจฉริยะสำหรับการดำเนินการที่ซับซ้อนและวนซ้ำหากเป็นไปได้
ไลบรารี่เหล่านั้นยังสามารถนำสิ่งต่าง ๆ (แบบมัลติเธรด) ไว้ด้านหลังของคุณและโปรแกรมเมอร์พิเศษทำให้พวกเขาทันสมัยอยู่เสมอ
ฉันทำการตรวจสอบอีกเล็กน้อยและปรากฎว่าใน C / C ++ แม้สำหรับการดำเนินงาน 5e9 = (50,000x100,000) ไม่มีความแตกต่างระหว่างการขึ้นและลงหากการทดสอบทำกับค่าคงที่เช่น @alestanis พูด (บางครั้งผลลัพธ์ JsPerf ไม่สอดคล้องกัน แต่โดยมากแล้วพูดเหมือนกัน: คุณไม่สามารถสร้างความแตกต่างใหญ่ได้)
ดังนั้นจึง--i
เป็นเรื่องที่ค่อนข้าง "หรูหรา" มันทำให้คุณดูเหมือนโปรแกรมเมอร์ที่ดีขึ้นเท่านั้น :)
ในทางตรงกันข้ามสำหรับการคลายในสถานการณ์ 5e9 นี้มันทำให้ฉันลดลงจาก 12 วินาทีเป็น 2.5 วินาทีเมื่อฉันไป 10 วินาทีและ 2.1 วินาทีเมื่อฉันอายุ 20 ปี มันไม่มีการเพิ่มประสิทธิภาพและการเพิ่มประสิทธิภาพได้ลดเวลาลงเล็กน้อย :) (การยกเลิกสามารถทำได้ในแบบของฉันด้านบนหรือการใช้i++
แต่นั่นไม่ได้นำสิ่งต่าง ๆ ใน JavaScript)
ทั้งหมดในทั้งหมด:เก็บi--
/ i++
และ++i
/ i++
ความแตกต่างในการสัมภาษณ์งานติดarray.forEach
หรือฟังก์ชั่นไลบรารีที่ซับซ้อนอื่น ๆ ;)