C ++ 11 memperkenalkan langkah semantik yang dapat, misalnya, meningkatkan kinerja kode dalam situasi di mana C ++ 03 perlu melakukan konstruksi salin atau tugas penyalinan. Artikel ini melaporkan bahwa kode berikut mengalami kecepatan 5x saat dikompilasi dengan C + 11:
vector<vector<int> > V;
for(int k = 0; k < 100000; ++k) {
vector<int> x(1000);
V.push_back(x);
}
Apa dampak dari semantik C ++ 11 dalam konteks komputasi ilmiah?
Saya tertarik dengan pertanyaan ini secara umum, tetapi lebih khusus lagi saya juga tertarik pada semantik bergerak untuk kode Elemen Hingga yang ditulis menggunakan boost library. Saya menguji beberapa kode C ++ 03 saya sendiri menggunakan boost versi 1.47.0 (karena catatan rilis menyebutkan langkah semantik diperkenalkan di 1.48.0) dan meningkatkan versi 1.53.0, tapi saya tidak melihat banyak perbaikan. Saya kira setiap penghematan dari tidak harus melakukan copy-konstruksi untuk boost::numeric::ublas::vector
/ matrix
dan boost::function
tidak terlihat karena memecahkan matriks sistem merupakan bagian terbesar dari beban kerja.
Sunting: Sebenarnya sepertinya memindahkan semantik hanya diterapkan untuk boost::function
(lihat versi 1.52.0 catatan rilis ). Tidak disebutkan tentang pindah semantik boost::numeric
, saya mengambil sumber untuk memastikan dan tampaknya tidak ada referensi nilai.
sumber
Jawaban:
Saya pikir dalam praktiknya dampaknya terbatas dan akan terbatas.
Alasan mengapa adalah terbatas sekarang adalah bahwa paket elemen hingga besar berhati-hati untuk menulis kode yang portabel, dan sehingga mereka belum menggunakan C ++ konstruksi 11 bahasa dalam kode mereka sendiri.
Tentu saja, mereka akan mendapat manfaat dari kode seperti yang Anda tunjukkan di mana, bahkan tanpa harus mengubah kode sumber, Anda mendapat manfaat dari pustaka dukungan kompiler yang ditingkatkan seperti libstdc ++ untuk GCC. Yang mengatakan, orang-orang dalam komputasi ilmiah cukup sadar akan biaya penyalinan dan karenanya, untuk objek yang penting, mereka tidak menyalin - mereka menghasilkan di tempat, atau mereka membuat salinan dangkal, atau mereka menggunakan shared pointer, atau banyak teknik lain yang tersedia untuk menghindari overhead menyalin. Dengan kata lain, situasi di mana semantik bergerak diciptakan sebenarnya tidak sering terjadi dalam kode ilmiah "nyata".
sumber