มีคำถามมาให้คิดกันให้ดูว่า source code ข้างล่างสองอันคิดว่าอันไหนเร็วกว่า
1.
[code]
for (int idx = 0; idx < 100; ++idx)
มีคำถามมาให้คิดกันให้ดูว่า source code ข้างล่างสองอันคิดว่าอันไหนเร็วกว่า
1.
[code]
for (int idx = 0; idx < 100; ++idx)
http://img98.imageshack.us/img98/731/ubd7518fj8.png
XSI - Behavior Programmer
Boardgame Thailand Fanclub
Ball Juggling~
คิดว่าเป็นอันแรกนะครับเพราะ architecture ของ CPU น่าจะทำการบวกเลขได้เร็วกว่าการลบ (จากวิชา computer architecture)
แต่จากที่ลองใน C++ แล้ว Big O เท่ากันผมไม่เห็นว่ามันจะต่างเลย
ลองเขียน assembly ดูแล้วก็ได้ประมาณนี้ครับ
[src]
===Increase========
mov eax,dword ptr [ebp-4]
add eax,1
mov dword ptr [ebp-4],eax
cmp dword ptr [ebp-4],0Ah
jge main+32h (00401042)
jmp main+21h (00401031)
===Descrease========
mov ecx,dword ptr [ebp-4]
sub ecx,1
mov dword ptr [ebp-4],ecx
cmp dword ptr [ebp-4],0
jle main+4Ch (0040105c)
jmp main+3Bh (0040104b)
[/src]
เฉลย
----------
Decrement จะเร็วกว่า เพราะว่าตรง condition loop
ถ้าเป็น Increment เทียบกับตัวเลข 1 ตัว (มีการลบ 1 ครั้ง)
ในขณะที่ Decrement ไม่ต้องเทียบกับตัวเลข (ใช้ jz) แค่ดูว่าเป็น 0 หรือไม่ จึงเร็วกว่า ด้วยประการชะนี้
ง่ายๆก็คือแบบ increment ต้อง cmp แต่ decrement ใช้ test ax, ax เร็วกว่า
http://img98.imageshack.us/img98/731/ubd7518fj8.png
XSI - Behavior Programmer
Boardgame Thailand Fanclub
Ball Juggling~
ขอบคุณครับ
ใช่ครับ decrement เร็วกว่า แต่สิ่งสำคัญที่สุดสำหรับเขียนโปรแกรมคือ ให้คนเข้าใจครับ โปรแกรมๆนึงเดี๋ยวนี้ซับซ้อนเกินกว่าจำทำด้วยตัวคนเดียวแล้ว
code ที่ดีต้องสามารถนำมา reuse ได้ นั่นรวมถึงการ maintenance และการ track bug ด้วย
ทุกวันนี้ speed cpu ก็เร็วมากแล้ว เพราะงั้น programmer ที่ดีควรจะคำนึงถึงเรื่องพวกนี้ด้วยนะครับ
ยกตัวอย่าง for(int i=count;--i>=0![]()
Actions : (View-Readers)
There are no names to display.