std::max

ปกติไม่ค่อยคุ้นเคยกับการเขียนโปรแกรมบน Visual Studio สักเท่าไหร่ เพราะถ้าไม่เขียนพวก script language ก็จะเขียนด้วย text editor ธรรมดา แล้วสร้าง Makefile เองเสียมากกว่า

พอดีมีเรื่องต้องใช้ C++ โปรเซสแต่ละเฟรมของไฟล์วิดีโอ ไม่มีอะไรมาก แค่เปรียบเทียบค่าของ Red และ Blue ของแต่ละ pixel ว่าอันไหนมีค่ามากกว่ากัน และดูว่ามันต่างกับค่าสี Green อยู่เท่าไหร่ แต่ละ pixel เป็น RGBTRIPLE คิดดูก็ไม่มีอะไรยาก

for (int i = 0; i < numPixels; i++, pRgb++) {
diff = pRgb->rgbtGreen - std::max(pRgb->rgbtRed, pRgb->rgbtBlue);
}

แค่เพิ่มโค้ดส่วนนี้เข้าไป ทำให้ไฟล์วิดีโอขนาด 784×576 ที่เคยเล่นได้ลื่นๆ กระตุก และเฟรมเรตลดลงไปเหลือประมาณ 10-15 fps (โดยประมาณ) ทันที
ไม่น่าเชื่อ…

ลองแก้ใหม่ เปลี่ยนบรรทัดที่เปรียบเทียบเป็น

diff = (prgb->rgbtBlue > prgb->rgbtRed)? prgb->rgbtGreen - prgb->rgbtBlue : prgb->rgbtGreen - prgb->rgbtRed;

กลายเป็นว่าวิดีโอไฟล์เดิม วิ่งฉิว ไม่มีหนืด ไม่มีกระตุก

โค้ดเดียวกันนี้ รันบน hardware เดียวกัน แต่เป็น Mac OS X ทำงานได้ว่องไว ไม่กระตุกเช่นกัน

สรุปว่า… งง…
std::max บน visual studio มัน implement มาไม่ดีหรือเปล่า ?

One Comment

  1. jittat says:

    อาจเป็นเพราะว่าถ้าเรียก std::max มันต้อง call function หรือเปล่าน่ะครับ
    (call ทีอาจต้องทำอะไรหลายอย่าง)

Leave a Reply