วิธีเขียนโปรแกรมวน Loop แล้ว CPU ขึ้นไม่ถึง 100%

วันนี้โม้ทางเทคนิคนะ เป็นเรื่องที่ผมหาคำตอบมาหลายปีแล้ว ในที่สุดก็หาวิธีเจอจนได้!!!

ไม่ว่าเราจะสร้างโปรแกรมคอมพิวเตอร์ เพื่อให้ทำงานบนระบบปฏิบัติการใด หรือสร้างมันขึ้นมาเพื่อ Platform ใดก็ตาม สิ่งหนึ่งที่หลีกหนีไม่พ้นก็คือการวนรอบ ๆ ๆ ๆ ๆ หรือเรียกว่าการวน Loop !!!

และไอ้การวน Loop เนี่ยแหล่ะ ที่นำมาซึ่งสภาวะ CPU ขึ้นถึง 100% (แต่ถ้าเป็น Core 2 Duo มันก็จะขึ้นถึง 50% เพราะมันแบ่ง ๆ กันไป) ไม่ว่าภายใน Loop นั้น ๆ จะมีคำสั่งมากมาย หรือไม่มีคำสั่งแม้แต่คำสั่งเดียวบรรจุอยู่เลยก็ตาม!!!

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

แต่หนทางในการแก้ไขมันก็ยังมีอยู่ และก็ไม่ยากเท่าไหร่ด้วย (เพิ่งจะรู้) ซึ่งนั่นก็คือ การใส่คำสั่ง …

Sleep

… เอาไว้ท้าย Loop … เพื่อบอกให้คอมพิวเตอร์รู้ว่า โปรแกรมของข้าพเจ้านั้นหยุดพักชั่วครู่แล้ว โปรแกรมของท่านใดอยากจะเอา CPU ไปใช้ก็เชิญเลย …

ซึ่งการกำหนดระยะเวลาในการ “นอนหลับ” นั้นหลากหลายมาก มีตั้งแต่ระดับวินาทีไปจนถึงระดับนาโนวินาทีเลยทีเดียว แต่ที่รู้มาก็คือช่วงเวลาที่เหมาะสมที่สุดในการทำให้โปรแกรม “นอนหลับ” ในแต่ล่ะรอบของ Loop ก็คือ 1 มิลลิวินาที!!!

ตอนนี้เลยได้รู้ซะทีว่าคำสั่งประเภท “นอนหลับ” ซึ่งทุกภาษามีให้ใช้กันนั้น แท้ที่จริงแล้วเอามาประยุกต์เพื่อทำแบบนี้ได้นี่เอง 😛

[tags]เขียน,โปรแกรม,วน,Loop,CPU,sleep[/tags]

Related Posts

8 thoughts on “วิธีเขียนโปรแกรมวน Loop แล้ว CPU ขึ้นไม่ถึง 100%

  1. นั่นสิคับ 1ms ผมว่าช้ามากเลยนะเนี่ย

    แต่ทริกนี้ก็น่าสนใจอยู่นะคับ
    คือ ให้ user set ได้เลยว่า อยากให้โปรแกรม “สูบ” cpu ขนาดไหน
    อย่างพวกโปรแกรม convert video อะไรแบบนี้

  2. เห็นด้วยกับการ Sleep นะครับ

    เคยได้รับมรดกต้องแก้โปรแกรมที่ทำงานแบบ Realtime
    ผมเจอคำสั่งน่าสงสัยใน loop while(true) คือ ทำไมต้องใส่ Sleep(1)
    แต่พอลองลบออก ก็พบว่าไม่มีผลเรื่องความเร็ว แต่กลับทำให้ CPU พุ่ง 100% ทันที

    มาได้คำตอบของเหตุผลก็วันนี้แหละครับ 😀

  3. ถ้าจำไม่ผิด สำหรับ Windows นะครับ

    ►► เหตผลที่ช้า
    เวลาเรา “คืนเวลาให้ กับ ระบบ (sleep)”
    มัน จะแย่งเวลาเราไปประมาณ 25 ms (ไปจัดการงานของ OS)
    ไม่ได้ sleep แค่ 1 ms เหมือนที่เรากำหนดครับ
    ดังนั้น ถ้า เรา sleep ทุก Loop เวลาของเราจะหายไป 25 ms ของแต่ละ Loop
    40 loop เวลาหายไป 1000 ms (1 sec) แล้วครับ

    ►► ทางแก้ครับ
    “ไม่ sleep ทุก Loop”
    • มี counter นับจำนวน Loop
    • คืนเวลา (sleep) เป็นช่วงๆ ตามจำนวน Loop ที่เราตั้งเอาไว้

    เช่น เมื่อเรา Loop ครบ 1000 loop แล้ว ก็ค่อย sleep ครับ

    ZZZzzz…คร๊อกกก…

  4. ช้าไปนิดดดดดนึงอ่ะคุณเอ มนุษย์เราไม่รู้ แต่คอมพิวเตอร์รู้อยู่เต็มอก

    555 เอางั้นเลยเหรอคุณ AMp แต่ถ้าเลือกได้ผมก็ว่า user คงสูบหมดแม็กเหมือนกันอ่ะ

    แสดงว่ารู้พร้อมกันครับคุณ KomsitR 😛 อิ อิ

    โหย อย่างสาหัสเลยแฮะ เพราะที่ผมรู้มาคือมันแย่งเวลาเราไปประมาณ 15ms แต่นี่คุณ icy7 บอกว่ามันแย่งเราไป 25ms แสดงว่าระบบปฏิบัติการมันบริโภค CPU เก่งจริง ๆ เลยพับผ่าสิ

  5. เท่าที่ผมเคยเขียนโปรแกรมมา ไม่เคยสั่งให้มัน sleep ต่ำกว่า 30 ms ได้เลยนะครับ กำหนดตัวเลขน้อยกว่านี้มันก็ทำได้แค่ 30 ms

    ถ้าเขียนโปรแกรมแบบหลายโปรเซสหรือหลายเธรด แล้วตัวหนึ่งต้องรออีกตัวหนึ่ง หากไม่อยากให้มันกิน CPU เลย (ดีกว่า sleep แล้วตื่นขึ้นมาเป็นระยะๆ) จะใช้วิธี IPC ให้อีกโปรเซสหนึ่งหรือเธรดหนึ่ง ส่ง signal มาบอกให้มันรู้ว่า นี่ๆตื่นได้แล้วนะ จึงค่อยตื่นตอนนั้นก็พอ

ใส่ความเห็น

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