Mam dwa powiązane pytania, jeden ogólny i jeden dotyczący projektu, nad którym pracuję.pętle, projektowanie i wydajność funkcji: dwa pytania
- Generalnie jeśli mam pętlę z dużą ilością powtórzeń (mln) z niektórymi częściami kodu są realizowane pod pewnymi warunkami, to jest lepsze (bardziej wydajne) mieć jedną pętlę z wielu instrukcji warunkowych lub wieloma pętlami bez im. Na przykład.
Przykład 1:
while (something())
{
// some common code
if (condition_a)
// some code
if (condition_b)
// some code
// some more common code
}
Przykład 2:
if (condition_a && condition_b)
{
while (something())
{
// some common and specific code
}
}
else if (condition_a)
while (something()) //..
else if (condition_b)
// Another loop
else //...
Wydaje się, że w przykładzie 2 skutkowałoby bardziej wydajnego kodu kosztem redundancji, ponieważ warunki są sprawdzane tylko raz zamiast milion razy. Jeśli wspólny kod jest ogromny lub istnieje wiele możliwych warunków, wydaje się to bardzo zbędne.
Teraz mój konkretny problem. Mam funkcję, która odczytuje punkty z pliku i wstawia je do struktury danych. Wygląda to mniej więcej tak:
while (reader-> read_point) { // robić pewne rzeczy // punkt wstawienia }
Problemem jest to, że istnieje kilka funkcji do czytania punkt, który powinien być stosowany na podstawie kryteriów podanych przez użytkownika. Na przykład read_point_inside_circle(), read_point_inside_rectangle() itp.
Idealnie chciałbym użyć wskaźnika funkcji do decydowania o poprawnej funkcji wcześniej, jednak nie sądzę, że jest to możliwe, ponieważ czytnik jest instancją klasy Reader (jeśli to możliwe, to rozwiąże wszystkie moje problemy).
W tej sytuacji jest lepiej, jeśli mam wiele pętli, które różnią się tylko warunkiem lub powinienem użyć wielu instrukcji if, aby uniknąć nadmiarowego kodu, np.
for(;;)
{
if (read_every_point)
if(!reader->read_point())
break;
else if (read_inside_circle)
if(!reader->read_inside_circle())
break;
else if // ...
}
Wątpię, aby pierwsze miało jakikolwiek wpływ na każdy współczesny kompilator. Poszedłbym z tym, co jest bardziej czytelne i pozwoliłbym, aby kompilator zoptymalizował to dla mnie. – amit