C ++ 11 wprowadza semantykę przenoszenia, która może na przykład poprawić wydajność kodu w sytuacjach, w których C ++ 03 musiałby wykonać konstrukcję kopii lub przypisanie kopii. W tym artykule opisano, że następujący kod przyspiesza 5-krotnie po skompilowaniu z C + 11:
vector<vector<int> > V;
for(int k = 0; k < 100000; ++k) {
vector<int> x(1000);
V.push_back(x);
}
Jaki jest wpływ semantyki ruchów w C ++ 11 w kontekście obliczeń naukowych?
Interesuje mnie to pytanie ogólne, ale dokładniej interesuje mnie również semantyka przenoszenia dla kodów elementów skończonych napisanych przy użyciu bibliotek doładowań. Przetestowałem część własnego kodu C ++ 03 przy użyciu wersji boost 1.47.0 (ponieważ informacje o wydaniu boost wspominają, że semantyka move została wprowadzona w wersji 1.48.0) i wersji boost 1.53.0, ale nie zauważyłem dużej poprawy. Wydaje mi się, że wszelkie oszczędności wynikające z konieczności wykonywania kopiowania dla boost::numeric::ublas::vector
/ matrix
i boost::function
nie są zauważalne, ponieważ rozwiązywanie macierzy systemowych stanowi większość obciążenia.
Edycja: W rzeczywistości wygląda na to, że semantyka przenoszenia jest zaimplementowana tylko dla boost::function
(patrz informacje o wersji 1.52.0 ). Nie ma wzmianki o semantyce przenoszenia w boost::numeric
, przeszukałem źródła, aby się upewnić i wydaje się, że nie ma odniesień do wartości.
źródło
Odpowiedzi:
Myślę, że w praktyce wpływ jest ograniczony i będzie ograniczony.
Powodem, dla którego jest to obecnie ograniczone, jest to, że duże pakiety elementów skończonych starają się pisać przenośny kod, więc nie używają jeszcze konstrukcji języka C ++ 11 we własnych kodach.
Oczywiście skorzystają na kodzie takim jak ten, który pokazujesz, nawet jeśli nie musisz zmieniać kodu źródłowego, skorzystasz z ulepszonej biblioteki obsługi kompilatora, takiej jak libstdc ++ dla GCC. To powiedziawszy, ludzie w informatyce naukowej są w pełni świadomi kosztów kopiowania, a więc w przypadku obiektów, w których ma to znaczenie, po prostu nie kopiują - albo generują w miejscu, albo wykonują płytkie kopie, lub używają współdzielonych wskaźniki lub wiele innych dostępnych technik w celu uniknięcia narzutu związanego z kopiowaniem. Innymi słowy, sytuacja, dla której wymyślono semantykę ruchu, w rzeczywistości nie zdarza się często w „prawdziwych” kodach naukowych.
źródło