บางท่านใช้บอร์ด Arduino มา ก็คงจะคุ้นเคยกันดีว่าบอร์ดแต่ละรุ่นมีความเร็วเท่าไร อย่าง UNO ก็ 16MHz แต่ในเชิงลึกล่ะ บางท่านอยากใช้งานที่มีความเป๊ะมาก ๆ ที่จำเป็นต้องรู้ว่าการทำงานแต่ละอย่างใช้เวลาเท่าใด ค่าต่าง ๆ คลาดเคลื่อนเท่าใด หรือจะลองทำเล่น ๆ ดู(ผู้เขียนเชื่อว่าหลายท่านก็คง Benchmark คอมพิวเตอร์ตัวเองกันบ่อย ๆ คอยดูตลอดว่าคอมตัวเองแรงอยู่ในระดับไหน ผู้เขียนเองก็เป็น) เราไปลองดูกันเลยครับ
โปรแกรมที่ใช้
จริง ๆ โปรแกรมสำหรับการทดสอบนั้นมีอธิบายในเว็บไซต์ของ Arduino อยู่แล้วครับ แต่เราต้องกดทดสอบทีละคุณสมบัติ สามารถไปดูได้ที่ Arduino Playground - ShowInfo
แต่ถ้าจะให้แนะนำ ผู้เขียนแนะนำให้ใช้ตัวโปรแกรมที่ดัดแปลงแล้วของคุณ Dan Watson ที่ผู้เขียนเองก็ใช้อยู่ ซึ่งคุณแดนได้ดัดแปลงให้มันทำงานออโต้ทุกอย่างครับ แค่เราอัพโหลดโค้ดลงไป เปิด Serial Monitor ขึ้นมาแล้วก็นั่งรอจนกว่ามันจะทำการทดสอบเสร็จเท่านั้น โดยสามารถดาวน์โหลดโค้ด ได้โดยตรงที่ gist ที่นี่ || หรือ Mirror2 ที่ GDrive ของเรา
Benchmark บอกอะไรเราบ้าง?
เมื่อทำการ Test บอร์ดของเรา บนหน้า Serial Monitor จะแสดงข้อความตามรูป ซึ่งก็คือเวลาที่ใช้ในการทำงานคำสั่งต่าง ๆ นั่นเอง เราเขียนคำสั่งไป 1 อย่าง บอร์ดตัวนี้ต้องใช้เวลาเท่าใดในการทำงาน โค้ดนี้ก็จะทำการทดสอบซ้ำ ๆ หลาย ๆ ครั้งแล้วหาค่าเฉลี่ยออกมาให้เรานะครับ ผลที่ได้ค่อนข้างเชื่อถือได้อยู่ เป็นการทดลองตามกระบวนการวิทยาศาสตร์ ในตัวอย่างนี้ผู้เขียนได้ลอง Benchmark กับ Arduino UNO R3 ที่มีขายในร้านเรานั่นเอง คำอธิบายอยู่ด้านล่างนะครับ
F_CPU คือ ความเร็วนาฬิกาของ CPU จากตัวอย่าง 16000000 = 16 x 1000000 = 16 MHz ตามสเปคของ Arduino UNO เป๊ะ
1/F_CPU คือ คาบเวลาของสัญญาณนาฬิกา 1 ลูกคลื่น ในตัวอย่างคือ 1 ลูกคลื่นสัญญาณจะมีคาบเวลา 0.0625 ไมโครวินาที (us)
nop ชื่อเต็ม ๆ ของมันคือ single cycle no operation เป็นคำสั่งให้ทำการทิ้งสัญญาณนาฬิกาไป 1 ลูกโดยที่ไม่ทำงานอะไร เพื่อความสเถียรของสัญญาณนาฬิกา(ให้ได้พักนิดนึง) ในตัวอย่างคือ 0.063 us ก็ประมาณ 1 ลูกคลื่นก่อนหน้านี้
digitalRead คือ เวลาที่ใช้ในการ digitalRead หนึ่งครั้ง
digitalWrite คือ เวลาที่ใช้ในการ digitalWrite หนึ่งครั้ง
pinMode คือ เวลาที่ใช้ในการเซ็ต pinMode หนึ่งครั้ง
multiply byte คือ เวลาที่ใช้ในการคำนวณ(คูณ)ค่าตัวแปรชนิด byte
divide byte คือ เวลาที่ใช้ในการคำนวณ(หาร)ค่าตัวแปรชนิด byte
add byte คือ เวลาที่ใช้ในการคำนวณ(บวก)ค่าตัวแปรชนิด byte
multiply integer คือ เวลาที่ใช้ในการคำนวณ(คูณ)ค่าตัวแปรชนิด integer
divide integer คือ เวลาที่ใช้ในการคำนวณ(หาร)ค่าตัวแปรชนิด integer
add integer คือ เวลาที่ใช้ในการคำนวณ(บวก)ค่าตัวแปรชนิด integer
multiply long คือ เวลาที่ใช้ในการคำนวณ(คูณ)ค่าตัวแปรชนิด long
divide long คือ เวลาที่ใช้ในการคำนวณ(หาร)ค่าตัวแปรชนิด long
add long คือ เวลาที่ใช้ในการคำนวณ(บวก)ค่าตัวแปรชนิด long
multiply float คือ เวลาที่ใช้ในการคำนวณ(คูณ)ค่าตัวแปรชนิด float
divide float คือ เวลาที่ใช้ในการคำนวณ(หาร)ค่าตัวแปรชนิด float
add float คือ เวลาที่ใช้ในการคำนวณ(บวก)ค่าตัวแปรชนิด float
itoa() คือ เวลาที่ใช้ในการแปลงค่าตัวแปร จากตัวแปรชนิด int ไปเป็นตัวแปรชนิด string
ltoa() คือ เวลาที่ใช้ในการแปลงค่าตัวแปร จากตัวแปรชนิด long ไปเป็นตัวแปรชนิด string
dtostrf() คือ เวลาที่ใช้ในการแปลงค่าตัวแปร จากตัวแปรชนิด float ไปเป็นตัวแปรชนิด string
random() คือ เวลาที่ใช้ในการสุ่มค่าใด ๆ ขึ้นมาค่าหนึ่ง
y |= (1<<x) คือ เวลาที่ใช้ในการทำ bitshift (ทดสอบด้วยการเลื่อนไปทางซ้าย)
bitSet() คือ เวลาที่ใช้ในการทำ bitSet()
analogReference() คือ ความไวในการตอบสนองเมื่อใช้ analogReference()
analogRead() คือ เวลาที่ใช้ในการทำ analogRead()
analogWrite() PWM คือ เวลาที่ใช้ในการส่งค่า PWM ออก
delay(1) คือ เวลาที่แท้จริงในการหน่วง 1 วินาที (1000.0000 us) ซึ่งบอร์ดตัวนี้คลาดเคลื่อนไป 0.007487 วินาที
delay(100) คือ เวลาที่แท้จริงในการหน่วง 100 วินาที (100000.0000 us) ซึ่งบอร์ดตัวนี้คลาดเคลื่อนไป 0.024984 วินาที
delayMicroseconds(2) คือ เวลาที่แท้จริงในการหน่วง 2 ไมโครวินาที ซึ่งในตัวอย่างทำงานจริงของบอร์ดตัวนี้จะหน่วงแค่ 0.757 us (คลาดเคลื่อน 62%)
delayMicroseconds(5) คือ เวลาที่แท้จริงในการหน่วง 5 ไมโครวินาที ซึ่งในตัวอย่างทำงานจริงของบอร์ดตัวนี้จะหน่วงแค่ 3.775 us (คลาดเคลื่อน 25%)
delayMicroseconds(100) คือ เวลาที่แท้จริงในการหน่วง 100 ไมโครวินาที ซึ่งในตัวอย่างทำงานจริงของบอร์ดตัวนี้จะหน่วงแค่ 99.287 us (คลาดเคลื่อน 0.72%)
จากตัวอย่างที่ลองทำให้ดูก็น่าจะพอมองเห็นอะไรบางอย่างนะครับ ซึ่งค่าเหล่านี้ก็จะต่างกันออกไปในบอร์ดแต่ละชิ้นแน่นอน เพราะอุปกรณ์อิเล็กทรอนิกส์นั้นมีความคลาดเคลื่อนกันเป็นปกติ จะมากจะน้อยก็เป็นอีกเรื่อง ใครไม่ซีเรียสอะไรก็ไม่ต้องสนใจมาก ทดสอบเอามันส์อย่างเดียว แต่งานที่ต้องเป๊ะ ๆ นิดนึง ค่าตรงนี้จะช่วยได้มากครับ เช่น อยากให้บันทึกค่าทุก 10 วิเป๊ะ ๆ แต่เราใส่คำสั่งต่าง ๆ ลงไปซึ่งทำงาน 0.08 วิมั่ง 0.11 วิมั่ง อะไรแบบนี้ รวมเวลาที่ใช้ในการทำงานก็ราว 1.6 วินาที จากต้อง delay(10000) ก็เหลือ delay(8400) การบันทึกในแต่ละช่วงก็จะห่างกันราว ๆ ใกล้ 10 วินาทียิ่งขึ้นนั่นเองครับ