witam
Robię program, który zajmuje się liczeniem. Istotna jest więc efektywność. Próbuję rozwiązać problem bardzo szybkiego podejmowania decyzji (wykonania odpowiedniej funkcji).
Program podejmie działania zależne od wartości pewnej zmiennej całkowitej. Powiedzmy, że w przypadku jeśli x == 1 wykona funkcje Fu1, a jesli x == 2 to wtedy funkcję Fu2. Załóżmy też, że tych funkcji i możliwych wartości jest trochę więcej, a decyzja będzie podejmowana miliony razy na sekundę.
Tworzenie ciągów typu:
if (x==1) Fu1();
else if (x==2) Fu2();
else if (x==3) Fu3();
to kompletna pomyłka. Za podobną pomyłkę uważam także switch - case, bo one również będą sprawdzać kolejne wartości. Jeśli możliwych wartości będzie 50, to czasem będzie potrzebne 50 porównań co jedno okrążenie pętli - wtedy czas wykonania programu zaczyna po prostu zależeć od czasu podjęcia decyzji
Pomyślałem, że skoro tak ważna jest wydajność, możnaby zastosować zupełnie nieczysty i niestrukturalny chwyt, który świetnie działał w BASIC-u (z użyciem GOTO)i w ASSEMBLERZE (z użyciem skoku relatywnego):
Szczególnie łatwo zobrazować to w BASICU, bo nie trzeba liczyć zajętości pamięci przez poszczególne rozkazy ...aha, wyjaśniam, że to jest "kopalniany" BASIC, bo ostatnio używłem go na ZX Spectrum ileś tam lat temu :)
998 REM szybka decyzja: wykonanie ktorejś z funkcji Fu1, Fu2, Fu3, Fu4...
999 REM w zależności od zmiennej x (kopalniany BASIC)
1000 GOTO (x+1000)
1001 GOTO Fu1
1002 GOTO Fu2
1003 GOTO Fu3
1004 GOTO Fu4
...
...
Jak widać program się rozgałęzia w zależności od zmiennej, ale nie ma porównań - po prostu sama zmienna steruje skokiem. Jeśli zmienna x wynosi 2, to wykona się GOTO 1002, a tam jest wywołanie funkcji Fu2. Dodatkowym plusem jest to, że każde takie podjęcie decyzji trwa tyle samo.
Wiem, że to jest rozwiązanie zupełnie parszywe, ale mój program jest już bardzo zaawansowany, a wcale nie rozrósł się nadmiernie, więc nie zaszkodzi mu taki "chwyt" w jednym kluczowym miejscu, a wręcz niezwykle pomoże.
Czy ktoś wie, jak można coś takiego powtórzyć w C++?? A jak wie, to czy podzieli się tą wiedzą na forum? :)