Switch กับ If-else อะไรเร็วกว่ากัน
เมื่อคืน 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 แทบจะเป็นค่าคงที่เลย
สำหรับ php ยังไม่ได้เขียน แค่คิดว่าผลน่าจะไปทาง if/else มากกว่าเนื่องจาก php ไม่มีการแปลง code ก่อนเหมือนสองภาษาข้างบน ไว้เย็นๆ ค่อยเขียนลองอีกทีละกัน
เอกสารเพิ่มเติมที่ pFz เอามาให้อ่าน :
เพิ่มเติมสำหรับภาษา php
Runtime, Sourcecode
เพิ่มเติมอีกภาษา ruby
Sourcecode
หลังจากทดลองพบความแตกต่างอย่างสิ้นเชิง เพราะ php กับ ruby switch ช้ากว่า if-else ทุกกรณี โดยเฉพาะ ruby switch นี่เมื่อตกกรณี default นี่ช้าโคตรๆ เลย แต่ php ผลกับใกล้เคียงกัน เห้อ อยู่กับ php ต่อไป ![]()




pF ;) September 24th
/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 - -?
วิน September 27th
จับเวลา build ด้วยสิครับ
llun September 27th
@pFz, นั่นสิเกิดอะไรขึ้นกับ PHP5
@วิน, จับไม่ทันอะจิ โค้ดสั้นแค่นี้ compile เร็วมาก
pF ;) January 28th
เพิ่มเติม
http://rob.sun3.org/php-code/switch-vs-if/
pF ;) August 14th
à¸�à¸à¸�à¸�ีà¹� PHP มี extension à¸�ีà¹�à¹�à¸�à¹� jump tables à¹�ลà¹�ว
http://www.suspekt.org/switchtable/
(author �ืภStefan Esser)
Add Yours
YOU