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 № 1Nie 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ź.