May 26, 2011
Thursday, May 26, 2011

วิธีทดสอบความเร็วในการทำงานสคริปต์ AutoIt

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

    วิธีการตรวจวัดความเร็วในการทำงานของสคริปต์ทำได้ง่ายๆ ด้วยอาศัยคำสั่ง 2 คำสั่งคือ

[*] TimerInit() เป็นคำสั่งสำหรับกำหนดจุดเริ่มวัดเวลา  เมื่อคุณใช้คำสั่งนี้กระแสเวลา ณ เวลานั้นจะถูกตีตราว่าเป็นจุดเริ่มการวัดเวลา

หมายเหตุ
    ต้องเข้าใจตรงนี้ให้ดีก่อนนะครับ ว่ากระแสเวลาดำเนินต่อเนื่องอยู่ตลอดเวลาแม้ว่าเราจะไม่ได้ใช้คำสั่ง TimerInit() ก็ตาม การใช้คำสั่งนี้เพียงแค่เป็นการตีตราสำหรับกำหนดจุดเริ่มเพื่อใช้วัดเท่านั้น เช่น คุณใช้คำสั่งตอน 8 โมงเช้า โปรแกรมก็จะเริ่มวัดเวลาที่ 8 โมงเช้า แต่ก่อนหน้านั้นก็จะเป็นเวลา 7 โมงเช้า 6 โมงเช้า ย้อนกลับไปเรื่อยๆ แต่โปรแกรมจะไม่รับรู้เพราะยังไม่ได้ทำการกำหนดจุดเริ่มนั่นเอง

[*] TimerDiff() เป็นคำสั่งที่ทำการจ้วงเข้าไปในห้วงเวลาที่ไหลผ่าน ณ ปัจจุบัน  ผลลัพธ์ที่ได้ออกมาก็จะช่วงเวลาที่แตกต่างระหว่างเวลา ณ จุดเริ่มวัดเวลา กับเวลา ณ ปัจจุบัน ซึ่งผลที่ได้ออกมานั้นจะเป็นตัวเลขหน่วย MS (มิลลิวินาที 1000 = 1 วินาที) ดังนั้นหากคุณต้องการตรวจดูเวลาให้เข้าใจง่ายขึ้น ต้องนำตัวเลขดังกล่าวมาหาร 1000 เพื่อให้ได้ตัวเลขที่เป็นวินาที จากนั้นก็ใช้คำสั่ง round มากำหนดจุดทศนิยม 2 ตำแหน่งหลังตัววินาที

เพื่อให้เข้าใจยิ่งขึ้นลองดูสคริปต์ด้านล่างนี้

$TM=TimerInit() ;เริ่มตันการวัดเวลา ใช้ตัวแปร $TM เป็นตัวอ้างอิง
Sleep(2100) ;หน่วงเวลา 2.1 วินาที
ConsoleWrite("เวลาคือ = "& Round(TimerDiff($TM)/1000,2)&"วินาที"&@LF)

ผลลัพธ์ที่ได้เมื่อรันสคริปต์นี้คือ 2.1 วินาที และถ้าเปลี่ยนสคริปต์อีกโดยเพิ่มการหน่วงเวลาอีก 1 วินาที เป็น

$TM=TimerInit() ;เริ่มตันการวัดเวลา ใช้ตัวแปร $TM เป็นตัวอ้างอิง
Sleep(2100) ;หน่วงเวลา 2.1 วินาที
ConsoleWrite("เวลาคือ = "& Round(TimerDiff($TM)/1000,2)&"วินาที"&@LF)
Sleep(1000) ;หน่วงเวลา 1.0 วินาที
ConsoleWrite("เวลาคือ = "& Round(TimerDiff($TM)/1000,2)&" วินาที"&@LF)


ผลลัพธ์แรกจะเป็น 2.1 วินาที ผลลัพธ์ที่สองก็จะเป็น 3.1 วินาที ดังภาพด้านล่างนี้ จะเห็นได้ว่าทุกครั้งที่ใช้คำสั่ง TimerDiff() เวลาจะเดินไปเรื่อย ไม่ได้ขึ้นอยู่กับว่าคุณเคยใช้คำสั่ง TimerDiff() ก่อนหน้านั้นหรือไม่ ดังนั้นหากต้องการวัดเวลาการทำงานของสคริปต์ คุณต้องใช้คำสั่ง TimerInit() ก่อนเริ่มต้นสคริปต์นั้นทุกครั้ง เพื่อให้การวัดเวลาเริ่มต้นใหม่อีกครั้ง



เริ่มทดสอบความเร็วของสคริปต์ ตัวอย่างที่ 1
    สำหรับตัวอย่างการทดสอบความเร็วสคริปต์ ผมจะยกตัวอย่างการใช้คำสั่ง ตัวดำเนินการกำหนดค่า (assignment operators) ที่เขียนแบบ $a += $i มาเทียบกับการใช้คำสั่ง $a = $a + $i ดูว่าแบบไหนจะทำงานได้เร็วกว่ากัน และเนื่องจากการทำงานของสคริปต์จะเร็วมากจึงไม่ต้องแปลงผลลัพธ์เป็นวินาที คุณลองเอาคำสั่งด้านล่างนี้ไปทดสอบดูครับว่าแบบไหนเร็วกว่ากัน

$a  =0
$TM=TimerInit()
;เริ่มตันการวัดเวลา ใช้ตัวแปร $TM เป็นตัวอ้างอิง
for $i = 1 to 1000
$a = $a + $i
Next
ConsoleWrite(" a มีค่าเท่ากับ = "&$a&""&@LF)
ConsoleWrite("เวลาในทำงานของสคริปต์ลำดับ 1 = "&  TimerDiff($TM)&" ms"&@LF)


$a  =0
$TM2=TimerInit()
;เริ่มตันการวัดเวลา ใช้ตัวแปร $TM2 เป็นตัวอ้างอิง
for $i = 1 to 1000
$a += $i
Next
ConsoleWrite(" a มีค่าเท่ากับ = "&$a&""&@LF)
ConsoleWrite("เวลาในทำงานของสคริปต์ลำดับ 2 = "&TimerDiff($TM2)&" ms"&@LF)


เริ่มทดสอบความเร็วของสคริปต์ ตัวอย่างที่ 2
    อีกตัวอย่างหนึ่งเป็นการทดสอบการวนลูป 10000 รอบระหว่างการใช้คำสั่ง For และ While เพื่อดูว่าคำสั่งไหนใช้เวลาในการวนลูปน้อยกว่ากัน อย่างไรก็ตามคำสั่งทั้ง 2 นี้ จะเป็นการวนลูปในสคริปต์เหมือนกัน แต่ก็ต้องคำนึงถึงการนำไปใช้ตามสถานะการณ์ที่เราต้องใช้เขียนโปรแกรม ไม่ใช่ว่าเห็นคำสั่งไหนเร็วกว่าก็ใช้คำสั่งนั้น ทั้งๆ ที่นำมาใช้แล้วยุ่งยากกว่า


$a  =0
$TM=TimerInit() ;เริ่มตันการวัดเวลา ใช้ตัวแปร $TM เป็นตัวอ้างอิง

For $i = 1 to 10000
$a +=1
Next
ConsoleWrite(" a มีค่าเท่ากับ = "&$a&""&@LF)
ConsoleWrite("เวลาในทำงานของสคริปต์ลำดับ 1 = "&  TimerDiff($TM)&" ms"&@LF)


$a  =0
$TM2=TimerInit() ;เริ่มตันการวัดเวลา ใช้ตัวแปร $TM2 เป็นตัวอ้างอิง

While $a < 10000
$a +=1
WEnd
ConsoleWrite(" a มีค่าเท่ากับ = "&$a&""&@LF)
ConsoleWrite("เวลาในทำงานของสคริปต์ลำดับ 2 = "&TimerDiff($TM2)&" ms"&@LF)




###จบแล้วครับ###

1 comments:

  1. ต้องการรู้วิธีเขียนสคิปซ์ AutoIt ให้กำหนดเวลาการใช้งานเวอร์ชั่นทดลอง
    อธิบายโดยยกตัวอย่าง ง่ายๆ เช่น ผมปล่อยตัวโปรแกรมเวอร์ชั่นทดลองให้ใช่กันก่อนฟรีๆ 7 วัน เมื่อคบกำหนดการใช้งาน 7วัน เมื่อตัวลูกค้าจะเข้าใช้งานตัวโปรแกรมก็จะไม่สามารถ เข้าใช้งานตัวโปรแกรมได้ เป็นต้น **จบcomment**

    ReplyDelete

    ส่วนนี้สำหรับแสดงความคิดเห็นทั่วไป สอบถามปัญหาตั้งถามได้ที่ฟอรั่ม


>>> [โปรดอ่าน] เนื่องจาก บทความการใช้งานบางโปรแกรมได้โฟสไปนานแล้ว
โปรแกรมอาจมีการอัปเดท วิธีการใช้งาน อาจใช้ไม่ได้ หรือมีวิธีที่ง่ายกว่าในเวอร์ชั่นใหม่
หากคุณพบว่าวิธีการใช้งานไม่ตรงกับบทความในบล็อกนี้ สามารถแนะนำเพิ่มเติมได้ครับ