กระโดดไปยังแผงนำทาง

Loop 24 April 2007 7:42 pm

บันทึกโดย Mr. PeeTai ใน : การสร้างซอฟต์แวร์ , ตรวจย้อนกลับ

คนเขียนซอฟต์แวร์ไม่รู้จัก Loop ล่ะก็เชยแย่เลย หวังว่าคงจะไม่เชยกันนะครับ :-P ไอ้เจ้า Loop นี่ถือเป็นเสน่ห์ของการสร้างซอฟต์แวร์เลยนะ เพราะมันทำให้เราสั่งคอมพิวเตอร์ให้ทำงานซ้ำ ๆ ได้ แถมแต่ล่ะรอบที่มันทำงานมันก็สามารถทำงานที่แตกต่างกันได้ด้วย

ในสมัยที่ผมยังเป็นนักวิเคราะห์ระบบอยู่นั้น เวลาผมต้องตรวจต้นฉบับซอฟต์แวร์ของใคร ผมจะดูที่การวน Loop ของเขาก่อนเลย ว่าเขาได้เค้นสมรรถนะของคอมพิวเตอร์ได้อย่างสูงสุดหรือยัง ไม่เคยสังเกตกันอ่ะดิ ใช่ม้า การวน Loop มันสำคัญนะ

บางคนใช้ Array ประกอบการวน Loop ด้วย เก่งมาก ๆ เลยล่ะ มันทำให้ต้นฉบับโปรแกรมมีขนาดเล็ก การลงมือเขียนโปรแกรมก็ไม่ต้องมาก ได้จำนวนบรรทัดที่น้อย แต่สามารถทำงานได้ผลลัพธ์ที่มหาศาล

ถ้าเราสังเกตกันดี ๆ เราจะพบว่าการวน Loop นั้น มันเหมือนกับการหมุนของ Stepping Motor ที่ไว้ใช้ขับดันฟันเฟืองให้ทำงาน ดังนั้นถ้าเราออกแบบการวน Loop ให้ดี มันจะได้ผลลัพธ์ที่มหาศาลมาก

โดยเฉพาะการเข้ารหัสถอดรหัสนั้น จะมีการใช้กลไกการวน Loop ที่ซับซ้อนมาก บางทีก็วนซ้อนกันหลายสิบชั้น แต่ล่ะชั้นก็อาจจะมีการวน Loop รอบเล็ก หรือรอบใหญ่ที่แตกต่างกัน

ประเด็นสำคัญที่เรามักพบในการวน Loop ซึ่งไม่รู้มีใครสนใจหรือเปล่า แต่ผมสนใจ และก็ไม่เคยแก้ตกเลย ก็เลยปล่อยเลยตามเลยไป นั่นก็คือ … เมื่อเราสร้างซอฟต์แวร์โดยบรรจุคำสั่งให้มันวน Loop แล้วเราสั่งให้มันทำงาน มันมักจะทำให้ CPU ของคอมพิวเตอร์เราขึ้นสูงถึง 100% เสมอ

มันทำให้เกิดปัญหานะ เพราะมันทำให้ซอฟต์แวร์ตัวอื่น ๆ ซึ่งก็ทำงานอยู่เหมือนกัน ไม่สามารถทำงานได้อย่างเต็มที่นัก เพราะโดนซอฟต์แวร์ของเรากินเวลาของ CPU ไป

การใส่คำสั่งเพื่อ Yield CPU ลงไปในซอฟต์แวร์ของเรา มันก็ไม่ได้ช่วยอะไรมากนัก เพราะถึงแม้ว่าเราจะ “แบ่ง” เวลาของ CPU เพื่อให้ซอฟต์แวร์ตัวอื่นแล้วก็ตาม แต่มันก็ไม่ทำให้การใช้งาน CPU ลดลงจาก 100% เลย

ผมว่าพวกฝรั่งเขาคงมีวิธีนะ ถึงได้สามารถเขียนซอฟต์แวร์ให้วน Loop แล้วไม่กินกำลังของ CPU ถึง 100%

Technorati Tags: , , , , ,

ความคิดเห็น»

1. วี - 24 April 2007

การ yield ถือว่าเป็นกลไกหนึ่งในระบบ cooperative multitasking ที่ให้สิทธิ์แบ่งเวลาให้โปรเซสอื่น ผมคิดว่าดีแล้วนะ และการที่ cpu ทำงานเต็มที่ ก็ถือว่าเป็นการใช้ทรัพยากรอย่างคุ้มค่า อย่างน้อยก็คือโปรเซสที่ yield ก็ให้สิทธิ์ตัวอื่นทำงานบ้าง โดยหวังว่าถ้าไม่มีใครคนอื่นทำ ตัวเองจะได้ทำต่อให้งานเสร็จไวๆ

ถ้าต้องการให้ cpu ทำงานไม่ถึง 100% จริงๆ นอกจากจะ yield แล้ว ก็สามารถหลับได้ครับ แต่ประเด็นอยู่ที่ถ้าตอนเรียก sleep() แล้วตอนนั้นไม่มีโปรเซสอื่นที่ต้องทำงานนานๆ ก็จะเป็นการเสีย cpu cycle ไปเสียเปล่าๆ

ส่วนอีกวิธีที่คิดได้ตอนนี้ ก็คือการลด priority ของโปรเซสนี้ อาจลดโดยการเซตในโปรแกรมเอง หรือเราสั่งลด task priority ด้วยมือ ก็ได้

แต่ผมสงสัยว่าทำไมถึงอยากให้ cpu ไม่ถึง 100% หรือครับ เพราะทำให้ GUI ไม่ responsive หรือเปล่า ถ้าใช่และจำเป็นต้องรันโปรเซสนั้นๆเป็นเวลานานๆ การลด priority น่าจะเป็นโยบายที่ดีของระบบ preemptive multitasking นะครับ

2. Tee - 25 April 2007

ใช้ CPU ขึ้น100%แปลได้หลายอย่างครับ
1) คนเขียน loop ห่วยทำงานเกินที่มันควรจะทำ
2) คนเขียน loop เก่งมาก optimize โดยความเร็วไม่คอขวดที่การไปหาของใน memory ใช้ register cache หมด

แต่ว่า ถ้าพี่ไท้หมายถึง การเขียน web-server ที่มันต้องวน loop แต่ loop ที่วนส่วนใหญ่ไม่ได้ทำอะไร

มันมีคำสั่ง sleep wait_pid select (แล้วแต่ว่าใช้ fork process หรือ threading) อะไรแถว ๆ นี้อ่ะครับ ที่ให้มันหลับจนกว่าจะมี signal หรือ ข้อมูลเข้ามาได้

3. พี่ไท้ - 25 April 2007

^o^ ผมหมายถึงการวน Loop ธรรมดาน่ะครับคุณ Tee เช่น

for (i_count = 0; i_count < 100000000; ++i_count)
printf("%d
", i_count);

แค่นี้ก็ทำให้ CPU ขึ้นถึง 100% แล้วครับ

ที่ไม่อยากให้ CPU มันถึง 100% ก็เพราะว่าถ้าโปรแกรมมันไปทำงานใน NoteBook ยี่ห้อไม่แพงมากอย่าง Acer มันจะทำให้ CPU ร้อนมาก ๆ เลยครับคุณวีเวลาที่มันใช้พลัง CPU ถึง 100%

4. Tee - 25 April 2007

เห็นข้างบนแล้ว นึกถึง yes > /dev/null ที่ทำ Macbook บางเครื่อง random shutdown ได้


*
เพื่อพิสูจน์ว่าคุณเป็นมนุษย์ (ไม่ใช่หุ่นยนต์) ดังนั้น กรุณาใส่รหัสป้องกันซึ่งแสดงอยู่ด้านล่างด้วยครับ
Anti-Spam Image