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:



Comments

  1. pF ;) September 24th

    Comment Arrow

    /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. วิน September 27th

    Comment Arrow

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


  3. llun September 27th

    Comment Arrow

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


  4. pF ;) January 28th

    Comment Arrow

    เพิ่มเติม

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


  5. pF ;) August 14th

    Comment Arrow

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

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

    (author �ือ Stefan Esser)


Add Yours

  • Author Avatar

    YOU


Comment Arrow



About Author

llun

Apple addict programmer