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

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

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

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

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

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

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

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

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

[tags]Loop, SaaS, Software as a Service, คอมพิวเตอร์, ซอฟต์แวร์, การสร้างซอฟต์แวร์[/tags]

Related Posts

4 thoughts on “Loop

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

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

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

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

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

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

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

  3. ^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%

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *