void foo(const int constant)
{
for(int i = 0; i < 1000000; i++) {
// do stuff
if(constant < 10) { // Condition is tested million times :(
// inner loop stuff
}
}
}
Dla każdego wykonania zewnętrznej pętli sprawdzana jest wartość "stała". Jednak ciągłe, niezmienne zmiany powodują zmarnowanie dużej ilości czasu procesora, aby przetestować stałą warunku < 10? w kółko. Człowiek zda sobie sprawę z tego, że po pierwszych kilku przejściach ta stała nigdy się nie zmienia i inteligentnie unika jej powtarzania. Czy kompilator to zauważy i inteligentnie ją zoptymalizuje, czy też powtarzająca się pętla jest nieunikniona?C++: Czy kompilator może zoptymalizować ten segment kodu?
Osobiście uważam, że problem jest nieunikniony. Nawet jeśli kompilator umieści porównanie przed zewnętrzną pętlą i ustawi jakąś zmienną boolean "skip_inner_stuff", ta zmienna będzie musiała być sprawdzona dla każdego przebiegu zewnętrznej pętli for.
Co myślisz o tej sprawie? Czy istnieje skuteczniejszy sposób napisania powyższego segmentu kodu, który pozwoliłby uniknąć problemu?
Myślę, że dobry optymalizator może to zrobić. Czy sprawdziłeś wygenerowany zespół? –
Kompilator prawie na pewno zoptymalizuje test. Najlepiej jest wygenerować montaż i przekonać się samemu. –
Jeśli twój kompilator nie zoptymalizuje tego (w trybie zwolnienia i bez pragma/instrukcji nie do)), to proponuję poszukać nowego kompilatora ... –