2011-12-13 21 views
30

Yeni auto anahtar sözcüğünü kullanarak kod yürütme süreleri azaldı. Aşağıdaki basit kod parçalarında problem daralmış:Visual Studio 2010'da 'auto' anahtar sözcüğünü kullanan performans cezası

#include <iostream> 
#include <map> 
#include <vector> 
#include <deque> 
#include <time.h> 

using namespace std; 

void func1(map<int, vector<deque<float>>>& m) 
{ 
    vector<deque<float>>& v = m[1]; 
} 

void func2(map<int, vector<deque<float>>>& m) 
{ 
    auto v = m[1]; 
} 

void main() { 

    map<int, vector<deque<float>>> m; 
    m[1].push_back(deque<float>(1000,1)); 

    clock_t begin=clock(); 
    for(int i = 0; i < 100000; ++i) func1(m); 
    cout << "100000 x func1: " << (((double)(clock() - begin))/CLOCKS_PER_SEC) << " sec." << endl; 

    begin=clock(); 
    for(int i = 0; i < 100000; ++i) func2(m); 
    cout << "100000 x func2: " << (((double)(clock() - begin))/CLOCKS_PER_SEC) << " sec." << endl; 

} 

benim i7/Win7 makinesi (Yayın modu; VS2010) almak çıkışı:

100000 x func1: 0.001 sec. 
100000 x func2: 3.484 sec. 

kimse açıklayabilir auto sonuçlarını kullanarak neden Böyle farklı uygulama sürelerinde?

Açıkçası, basit bir geçici çözüm var, yani auto'u kullanmayı bırakın ama umarım bu sorunun üstesinden gelmenin daha iyi bir yolu vardır.

cevap

34

Vektörü v'a kopyalıyorsunuz.

Bo söylediği gibi bir referansı

auto& v = ... 
+1

Kahretsin, o sorulara cevap vermek gerçekten hızlı olmak zorunda. ;-) – Andre

+0

Düşündüm (ama sanırım yanılıyordum) bu otomatik fonksiyonun dönüş türünü kullanır. Operatör [] referans tipi referanstır, öyleyse neden ekstra '&' eklememiz gerekiyor? – MDman

+12

@MDman: 'auto', üst düzey cv'yi ve referansı kaldırır, çıkarılan türü" bozar ". – Xeo

13

oluşturmak yerine bu deneyin, siz (diğer durumlar için de auto* olduğunu, Not) auto& yerine auto kullanmak zorunda. İşte kod güncelleştirilmiş versiyonu:

#include <functional> 
#include <iostream> 
#include <map> 
#include <vector> 
#include <deque> 
#include <time.h> 

using namespace std; 

typedef map<int, vector<deque<float>>> FooType; // this should have a meaningful name 

void func1(FooType& m) 
{ 
    vector<deque<float>>& v = m[1]; 
} 

void func2(FooType& m) 
{ 
    auto v = m[1]; 
} 

void func3(FooType& m) 
{ 
    auto& v = m[1]; 
} 

void measure_time(std::function<void(FooType&)> func, FooType& m) 
{ 
    clock_t begin=clock(); 
    for(int i = 0; i < 100000; ++i) func(m); 
    cout << "100000 x func: " << (((double)(clock() - begin))/CLOCKS_PER_SEC) << " sec." << endl; 
} 

void main() 
{ 
    FooType m; 
    m[1].push_back(deque<float>(1000,1)); 

    measure_time(func1, m); 
    measure_time(func2, m); 
    measure_time(func3, m); 
} 

benim bilgisayarda, aşağıdaki çıktıyı verir:

100000 x func: 0 sec. 
100000 x func: 3.136 sec. 
100000 x func: 0 sec. 
İlgili konular