เมื่อคืน pFz เอา url ที่เกี่ยวกับการเปรียบเทียบระหว่าง switch กับ if-else โดยคำตอบก่อนที่ pFz จะแจมไปก็คือ if-else เร็วกว่า แต่ pFz แย้งไปตรงข้ามเพราะ compiler ส่วนใหญ่จะมีการแต่ง switch ให้เร็วขึ้นโดยการแปลงเป็น hash table ซะ ดูไปก็ไม่รู้หรอกว่าอะไรจะเร็วกว่า เลยลองเขียน จาวากับซีมาทดลองดูให้เห็นกันไปเลย
ผลสรุปก็คืออะไรจะเร็วกว่าอะไรขึ้นกับ
- จำนวนกรณีที่นำมาเปรียบเทียบยิ่งเยอะจะยิ่งเห็นผลชัด
- กรณีที่ตกลงไปในการเปรียบเทียบ จากโค้ดก็คือค่า cSample นั่นเอง โดยถ้าตกในกรณีแรกของ if หรือ case แน่นอน if จะเร็วกว่า แต่ถ้าตกกรณีหลังๆ switch จะเร็วกว่า
ผลลัพธ์ เลขบนคือ switch เลขล่างคือ if-else Java, cSample = 0
llun@pluto:~/Desktop/test$ java Test
1467552309
1264288753
Java, cSample = 50 (default/else)
llun@pluto:~/Desktop/test$ java Test
2286091238
2327289899
Java, cSample = 15 (middle)
llun@pluto:~/Desktop/test$ java Test
1424442862
1570707918
Java ยิ่งตกเคสหลังๆ if/else จะช้าลง คล้าย switch แต่ switch หลังๆ จะเร็วหว่า
C, cSample = 0
llun@pluto:~/Desktop/test$ ./test
8.00
7.00
C, cSample = 50 (default/else)
llun@pluto:~/Desktop/test$ ./test
6.00
43.00
C, cSample = 15 (middle)
llun@pluto:~/Desktop/test$ ./test
8.00
26.00
ของ C นี่ switch แทบจะเป็นค่าคงที่เลย
เอกสารเพิ่มเติมที่ pFz เอามาให้อ่าน :
เพิ่มเติมสำหรับภาษา php Runtime, Sourcecode เพิ่มเติมอีกภาษา ruby Sourcecode หลังจากทดลองพบความแตกต่างอย่างสิ้นเชิง เพราะ php กับ ruby switch ช้ากว่า if-else ทุกกรณี โดยเฉพาะ ruby switch นี่เมื่อตกกรณี default นี่ช้าโคตรๆ เลย แต่ php ผลกับใกล้เคียงกัน เห้อ อยู่กับ php ต่อไป
/me ลองทดสอบบน พหุบัญชร ได้ผลน่าสนใจดังนี้ (Windows XP Sp2)
$cSample = 29; $loop = 500000;
PHP4.4.7 —— If -> Switch ——— if: 4.9072861671448 sw: 3.2068388462067
if: 4.8680701255798 sw: 3.2063720226288
if: 4.9575459957123 sw: 3.2130420207977
if: 5.5792670249939 sw: 3.6598889827728
if: 4.9783608913422
sw: 3.6139650344849
—— Switch -> If ——— sw: 3.235081911087 if: 4.7577199935913
sw: 3.2674129009247 if: 4.7468400001526
sw: 3.1826031208038 if: 4.8480641841888
sw: 3.2316401004791 if: 4.7635009288788
sw: 3.2064731121063
if: 4.7568180561066
PHP5.2.4 —— If -> Switch ——— if: 7.4616868495941 sw: 10.840448856354
if: 7.4788382053375 sw: 10.83944106102
if: 7.4432780742645 sw: 10.873199939728
if: 7.431321144104 sw: 10.847477912903
if: 7.4480481147766
sw: 10.849196910858
—— Switch -> If ——— sw: 10.91282081604 if: 7.3389999866486
sw: 10.952208042145 if: 7.3691239356995
sw: 10.938215970993 if: 7.3439769744873
sw: 10.994127035141 if: 7.3407678604126
sw: 10.951628923416
if: 7.3361880779266
ป.ล.๑ If -> Switch คือ code ซึ่ง ทั้งตัว function และตัวเรียก function เริ่มจาก if ก่อน switch ส่วน Switch -> If ก็กลับกัน ป.ล.๒ เกิดอะไรขึ้นกับ PHP5 – -?
จับเวลา build ด้วยสิครับ
@pFz, นั่นสิเกิดอะไรขึ้นกับ PHP5 @วิน, จับไม่ทันอะจิ โค้ดสั้นแค่นี้ compile เร็วมาก
เพิ่มเติม
http://rob.sun3.org/php-code/switch-vs-if/
à¸�à¸à¸�à¸�ีà¹� PHP มี extension à¸�ีà¹�à¹�à¸�à¹� jump tables à¹�ลà¹�ว
http://www.suspekt.org/switchtable/
(author �ืภStefan Esser)
เด็ดจริงๆ กำลังหาคำตอบอยู่เลย ขอบคุณครับ