Switch กับ If-else อะไรเร็วกว่ากัน

เมื่อคืน pFz เอา url ที่เกี่ยวกับการเปรียบเทียบระหว่าง switch กับ if-else โดยคำตอบก่อนที่ pFz จะแจมไปก็คือ if-else เร็วกว่า แต่ pFz แย้งไปตรงข้ามเพราะ compiler ส่วนใหญ่จะมีการแต่ง switch ให้เร็วขึ้นโดยการแปลงเป็น hash table ซะ ดูไปก็ไม่รู้หรอกว่าอะไรจะเร็วกว่า เลยลองเขียน จาวากับซีมาทดลองดูให้เห็นกันไปเลย

sourcecode: Java, C

ผลสรุปก็คืออะไรจะเร็วกว่าอะไรขึ้นกับ

  1. จำนวนกรณีที่นำมาเปรียบเทียบยิ่งเยอะจะยิ่งเห็นผลชัด
  2. กรณีที่ตกลงไปในการเปรียบเทียบ จากโค้ดก็คือค่า 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 เอามาให้อ่าน :

  1. Java switch
  2. PHP switch
  3. Switching track in java
เพิ่มเติมสำหรับภาษา php Runtime, Sourcecode เพิ่มเติมอีกภาษา ruby Sourcecode หลังจากทดลองพบความแตกต่างอย่างสิ้นเชิง เพราะ php กับ ruby switch ช้ากว่า if-else ทุกกรณี โดยเฉพาะ ruby switch นี่เมื่อตกกรณี default นี่ช้าโคตรๆ เลย แต่ php ผลกับใกล้เคียงกัน เห้อ อยู่กับ php ต่อไป :razz:

Tags: , , , ,

6 Responses to “Switch กับ If-else อะไรเร็วกว่ากัน”

  1. pF ;) 24. Sep, 2007 at 6:19 pm #

    /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 – -?

  2. วิน 27. Sep, 2007 at 2:46 pm #

    จับเวลา build ด้วยสิครับ

  3. llun 27. Sep, 2007 at 8:33 pm #

    @pFz, นั่นสิเกิดอะไรขึ้นกับ PHP5 @วิน, จับไม่ทันอะจิ โค้ดสั้นแค่นี้ compile เร็วมาก

  4. pF ;) 28. Jan, 2008 at 8:29 am #

    เพิ่มเติม

    http://rob.sun3.org/php-code/switch-vs-if/

  5. pF ;) 14. Aug, 2008 at 8:56 pm #

    �อ��ี� PHP มี extension �ี���� jump tables �ล�ว

    http://www.suspekt.org/switchtable/

    (author �ือ Stefan Esser)

  6. I'm Number One 01. Feb, 2009 at 8:50 pm #

    เด็ดจริงๆ กำลังหาคำตอบอยู่เลย ขอบคุณครับ

Leave a Reply