Ogólnie (biorąc pod uwagę wszystkie języki i wszystkie kompilatory) instrukcja switch MOŻE CZASEM być bardziej wydajna niż instrukcja if / else, ponieważ kompilator łatwo generuje tabele skoku z instrukcji switch. Można zrobić to samo dla instrukcji if / else z odpowiednimi ograniczeniami, ale jest to o wiele trudniejsze.
W przypadku C # jest to również prawdą, ale z innych powodów.
Przy dużej liczbie ciągów znacząca przewaga wydajności polega na użyciu instrukcji switch, ponieważ kompilator użyje tabeli skrótów do wdrożenia skoku.
Przy niewielkiej liczbie ciągów wydajność między nimi jest taka sama.
Jest tak, ponieważ w takim przypadku kompilator C # nie generuje tabeli skoków. Zamiast tego generuje MSIL, który jest równoważny blokom IF / ELSE.
Istnieje instrukcja MSIL „instrukcja przełączania”, która po wysłaniu użyje tabeli skoków do implementacji instrukcji przełączania. Działa jednak tylko z typami liczb całkowitych (to pytanie dotyczy ciągów znaków).
W przypadku niewielkiej liczby łańcuchów kompilator bardziej efektywnie generuje bloki IF / ELSE, niż korzysta z tabeli skrótów.
Kiedy pierwotnie to zauważyłem, założyłem, że ponieważ bloki IF / ELSE były używane z małą liczbą łańcuchów, to kompilator dokonał tej samej transformacji dla dużej liczby łańcuchów.
To było ŹLE. „IMA” był na tyle uprzejmy, aby mi to wskazać (cóż ... nie był do tego miły, ale miał rację, a ja się myliłem, co jest ważną częścią)
Przyjąłem również założenie, że brak instrukcji „przełączania” w MSIL (pomyślałem, że jeśli istnieje prymityw przełącznika, to dlaczego nie używają go z tabelą skrótów, więc nie może istnieć prymityw przełącznika). ...) To było zarówno złe, jak i niesamowicie głupie z mojej strony. „IMA” ponownie mi to wskazało.
Dokonałem tutaj aktualizacji, ponieważ jest to najwyżej oceniany post i zaakceptowana odpowiedź.
Zrobiłem to jednak Wiki Wiki, ponieważ uważam, że nie zasługuję na REP za to, że się mylę. Jeśli masz szansę, zagłosuj na wpis „ima”.