2013-10-02 30 views
6

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 
+3

Montaj çıkışını kontrol ettiniz mi? – balki

+1

Tutarlı sonuçlar aldığınızdan emin olmak için defalarca çalıştırdınız mı? –

+0

Bilgisayarınızın bu kadar hızlı çalışması benim için ne kadar hızlı – aaronman

cevap

11

tanımlama grubu tüm varsayılan yapı değerleri çiftler alamadım varsayılan (böylece her 0'dır) başlatıldı. Oluşturulan düzenekte, aşağıdaki başlatma döngüsünü yalnızca tupl'leri kullanırken mevcuttur. Aksi halde eşdeğerdirler.

.L2: 
    movq $0, (%rdx) 
    addq $8, %rdx 
    cmpq %rcx, %rdx 
    jne .L2 
+0

Montajda doğrulandı. İki döngü, bir sıfırlama ve bir toplama yapar. çifte dayalı bir tane sadece bir tane var. – zch

+0

@zch Eğer cevabımı düzenleyebilirseniz, gerçekten bir montaj okuma modunda değilsiniz – aaronman

+6

Mükemmel gözlem. OP, adil bir karşılaştırma için 'new double_t [count]();' yazmalıdır. –