C ++ 11 führt eine Verschiebungssemantik ein, die beispielsweise die Codeleistung in Situationen verbessern kann, in denen C ++ 03 eine Kopierkonstruktion oder eine Kopierzuweisung durchführen müsste. Dieser Artikel berichtet, dass der folgende Code beim Kompilieren mit C + 11 eine 5-fache Geschwindigkeit erfährt:
vector<vector<int> > V;
for(int k = 0; k < 100000; ++k) {
vector<int> x(1000);
V.push_back(x);
}
Welche Auswirkungen hat die C ++ 11-Bewegungssemantik im Kontext des wissenschaftlichen Rechnens?
Diese Frage interessiert mich allgemein, aber insbesondere interessiert mich auch die Verschiebungssemantik für Finite-Elemente-Codes, die mit Boost-Bibliotheken geschrieben wurden. Ich habe einen Teil meines eigenen C ++ 03-Codes mit der Boost-Version 1.47.0 (da in den Boost-Versionshinweisen erwähnt wird, dass die Verschiebungssemantik in 1.48.0 eingeführt wurde) und der Boost-Version 1.53.0 getestet, aber ich habe keine große Verbesserung festgestellt. Ich vermute, dass Einsparungen dadurch entstehen, dass für boost::numeric::ublas::vector
/ keine Kopierkonstruktion durchgeführt werden muss, matrix
und dass dies boost::function
nicht spürbar ist, da das Lösen von Systemmatrizen den größten Teil der Arbeitslast ausmacht.
Bearbeiten: Eigentlich sieht es so aus, als ob die Verschiebungssemantik nur für implementiert ist boost::function
(siehe Versionshinweise zu Version 1.52.0 ). Es gibt keine Erwähnung der Verschiebungssemantik in boost::numeric
, ich habe die Quellen überprüft, um sicherzugehen, und es scheint keine Wertreferenzen zu geben.
quelle
Antworten:
Ich denke, in der Praxis sind die Auswirkungen begrenzt und werden begrenzt sein.
Der Grund , warum es ist jetzt begrenzt ist , dass die großen Finite - Elemente - Pakete vorsichtig zu schreiben Code, der tragbar ist, und so sie noch nicht verwenden C ++ 11 Sprachkonstrukte in ihren eigenen Codes.
Natürlich profitieren sie von Code wie dem von Ihnen gezeigten, bei dem Sie auch ohne Änderung des Quellcodes von einer verbesserten Compiler-Unterstützungsbibliothek wie libstdc ++ für GCC profitieren. Das heißt, die Leute im wissenschaftlichen Rechnen sind sich der Kosten des Kopierens ziemlich bewusst und kopieren für Objekte, bei denen es darauf ankommt, einfach nicht - sie generieren entweder direkt oder sie erstellen flache Kopien oder sie verwenden gemeinsam genutzte Zeiger oder viele andere verfügbare Techniken, um den Aufwand für das Kopieren zu vermeiden. Mit anderen Worten, die Situation, für die die Bewegungssemantik erfunden wurde, kommt in "echten" wissenschaftlichen Codes nicht sehr häufig vor.
quelle