Tek bir öğe de dahil olmak üzere birçok durumda std::tuple
'u kullanarak kodumu daha genel hale getirmek üzereyim. Örneğin double
yerine tuple<double>
demek istiyorum. Ama bu özel durumun performansını kontrol etmeye karar verdim. O başlığın düşünce C++ 11 tuple performansı
$ g++ -DTUPLE -O2 -std=c++11 test.cpp && time ./a.out
0
real 0m3.347s
user 0m2.839s
sys 0m0.485s
$ g++ -O2 -std=c++11 test.cpp && time ./a.out
0
real 0m2.963s
user 0m2.424s
sys 0m0.519s
sıkı statik derlenmiş şablon ve almak <> fonksiyonların hepsi sadece olağan çalışıyoruz geçerli:
#include <tuple>
#include <iostream>
using std::cout;
using std::endl;
using std::get;
using std::tuple;
int main(void)
{
#ifdef TUPLE
using double_t = std::tuple<double>;
#else
using double_t = double;
#endif
constexpr int count = 1e9;
auto array = new double_t[count];
long long sum = 0;
for (int idx = 0; idx < count; ++idx) {
#ifdef TUPLE
sum += get<0>(array[idx]);
#else
sum += array[idx];
#endif
}
delete[] array;
cout << sum << endl; // just "external" side effect for variable sum.
}
Ve çalıştırmak sonuçları: Burada
basit performans kriter testtir Bu durumda değişken erişim. Bu testteki BTW bellek ayırma boyutları aynıdır. Bu yürütme süresi farkı neden oluyor?DÜZENLEME: Sorun, tuple <> nesnesinin başlatılmasındaydı. Test daha doğru hale getirmek için bir satır değiştirilmelidir: bu bir benzer sonuçlar gözlemleyebilirsiniz
constexpr int count = 1e9;
- auto array = new double_t[count];
+ auto array = new double_t[count]();
long long sum = 0;
sonra:
$ g++ -DTUPLE -g -O2 -std=c++11 test.cpp && (for i in $(seq 3); do time ./a.out; done) 2>&1 | grep real
real 0m3.342s
real 0m3.339s
real 0m3.343s
$ g++ -g -O2 -std=c++11 test.cpp && (for i in $(seq 3); do time ./a.out; done) 2>&1 | grep real
real 0m3.349s
real 0m3.339s
real 0m3.334s
Montaj çıkışını kontrol ettiniz mi? – balki
Tutarlı sonuçlar aldığınızdan emin olmak için defalarca çalıştırdınız mı? –
Bilgisayarınızın bu kadar hızlı çalışması benim için ne kadar hızlı – aaronman