Dobry kompilator może i wybierze między tabelą skoku, połączonym łańcuchem/lub kombinacją. Źle zaprojektowany kompilator może nie dokonać takiego wyboru - i może nawet wygenerować bardzo zły kod dla bloków przełączających. Ale każdy przyzwoity kompilator powinien wytworzyć wydajny kod dla bloków przełączających. T
głównym czynnikiem decydującym o tym, że kompilator może wybrać, czy/else gdy liczby są daleko od siebie (i nie trywialnie (np. Dzieląc przez 2, 4, 8, 16, 256 itd.) Zmienione na bliżej wartości] np
switch(x)
{
case 1:
...
case 4912:
...
case 11211:
...
case 19102:
...
}
wymaga tabeli skoku co najmniej 19102 * 2 bajty.
Z drugiej strony, jeśli liczby są blisko siebie, kompilator będzie zazwyczaj używał opcji do pomylenia.
Nawet jeśli jest to if/else
typ konstrukcji, to zazwyczaj zrobić „binarne przeszukiwanie” - jeśli weźmiemy powyższym przykładzie:
if (x <= 4912)
{
if (x == 1)
{
....
}
else if (x == 4912)
{
....
}
} else {
if (x == 11211)
{
....
}
else if (x == 19102)
{
...
}
}
Jeśli mamy wiele przypadków, takie podejście będzie gniazdo dość głęboko , a ludzie prawdopodobnie zgubią się po trzech lub czterech poziomach głębokości (mając na uwadze, że każdy z nich zaczyna się w pewnym punkcie ŚREDNI zakresu), ale zmniejsza liczbę testów o log2 (n), gdzie n jest liczba opcji do wyboru. Jest to z pewnością dużo bardziej wydajny niż naiwnego podejścia
if (x == first value) ...
else if (x == second value) ...
else if (x == third value) ...
..
else if (x == nth value) ...
else ...
ten może być nieco lepiej, jeśli niektóre wartości są umieszczane na początku łańcucha if-else, ale zakłada, można określić, co jest najczęstszą przed uruchomieniem kodu.
Jeśli wydajność jest KRYTYCZNA dla twojej sprawy, musisz porównać te dwie możliwości. Ale domyślam się, że samo napisanie kodu jako przełącznika sprawi, że kod stanie się bardziej przejrzysty, a jednocześnie będzie działał co najmniej tak szybko, jeśli nie szybciej.
1) Prawdopodobnie zależy to od kompilatora. Którego używasz? 2) Dlaczego cię to obchodzi? Powinieneś zaufać swojemu kompilatorowi, aby zrobił wszystko, co w jego mocy, za pomocą kodu, który napiszesz. Tabela skoków może nie być najlepszym wyborem we wszystkich przypadkach. Nie dość odpowiada na twoje pytanie, ale możesz być zainteresowany http://ols.fedoraproject.org/GCC/Reprints-2008/sayle-reprint.pdf – BoBTFish
@BoBTFish: Dzięki za wskaźnik, docenione. –
@BoBTFish Dzięki, wydaje się miło przeczytać, gdybym tylko miał czas (: –