/ / Zakres dla pętli C ++ 11 od strony optymalizacji [duplikat] - c ++, wydajność, c ++ 11, pętla for, cykl

Oparte na zakresie dla pętli C ++ 11 ze strony optymalizacji [duplikat] - c ++, wydajność, c ++ 11, pętla for, cykl

Na przykład chcę wydrukować zawartość wektorową. Co będzie wykonywane szybciej, cykl "tradycyjny dla" (1) lub C ++ 11 (2)? Czy w ogóle nie ma różnicy prędkości? Wszelkie informacje są mile widziane.

1)

for (int i=0;i<FooBar_vector.size();i++)
{
cout<<FooBar_vector[i]<<endl;
}

2)

for (auto &val : FooBar_vector)
{
cout<< val <<endl;
}

Odpowiedzi:

2 dla odpowiedzi № 1

Nie ma podstawowych powodów, dla których pętla dystansowa była wolniejsza niż pętla ręczna. Kod, w którym pętla oparta na odległościach jest zdefiniowana jako identyczna, jest relatywnie optymalną pętlą.

W twoim przypadku każda iteracja pętli logicznie wywołuje size(). Jeśli w jakimkolwiek punkcie pętli kompilator nie będzie w stanie tego dowieść size() nie można zmienić w pętli, kompilator musi faktycznie zadzwonić size() (co zazwyczaj wymaga odjęcia dwóch wskaźników) i sprawdź to. Może to kosztować pewną wydajność w ręcznym przypadku pętli.

w for(:) pętli może kosztować poprawność, w tym, że jeśliwektor zapętlony ma iterator początkowy lub końcowy (lub bieżący iterator) unieważniony w trakcie pętli, pętla kontynuuje pętlę nad starymi iteratorami i może wystąpić niezdefiniowane zachowanie.

Więc obie pętle nie są (ogólnie) równoważne.

W przypadkach, w których zasięg zakręcony jest niezmienny, for(:) pętla będzie działała równie dobrze, lub lepiej, niż większość ręcznie wykonywanych pętli, które po prostu powtarzają się nad elementami, ponieważ większość ręcznie wykonywanych pętli nie tworzy kopii end() i porównaj z tą kopią.

W tym konkretnym przypadku obciążenie IO (i w mniejszym stopniu formatowanie) znacznie przytłoczy wszelkie obciążenie pętli.


5 dla odpowiedzi nr 2

Łatwa odpowiedź: użyj profilera.

Lepsza odpowiedź: dlaczego martwisz się wydajnością? Użyj # 2, jest bardziej przejrzysty i mniej podatny na błędy / literówki.

Odpowiedź: Strumień przesyłania strumieniowego do cout prawdopodobnie znacznie przewyższa wszelki nadmiar pętli. Ale zobacz łatwą odpowiedź.