2011-12-13 6 views
30

नए auto कीवर्ड का उपयोग करके मेरे कोड निष्पादन समय को कम कर दिया गया है। मैं निम्नलिखित सरल कोड स्निपेट के लिए समस्या संकुचित:विजुअल स्टूडियो 2010 में 'ऑटो' कीवर्ड का उपयोग करके प्रदर्शन जुर्माना

#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; 

} 

उत्पादन मैं अपने i7/Win7 मशीन (रिलीज़ मोड; VS2010) पर मिलता है:

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

किसी को भी व्याख्या कर सकते हैं क्यों का उपयोग कर auto परिणाम इस तरह के एक अलग निष्पादन समय में?

जाहिर है, एक सरल कामकाज है, यानी auto पूरी तरह से उपयोग करना बंद करें, लेकिन मुझे उम्मीद है कि इस मुद्दे को दूर करने का एक बेहतर तरीका है।

उत्तर

34

आप वेक्टर को v पर कॉपी कर रहे हैं।

एक संदर्भ

auto& v = ... 
+1

अरे, तुम सच में उन सवालों के जवाब देने में तेजी से होना चाहिए। ;-) – Andre

+0

मैंने सोचा (लेकिन मुझे लगता है कि मैं गलत था) कि ऑटो फ़ंक्शन के रिटर्न प्रकार का उपयोग करता है। ऑपरेटर का रिटर्न प्रकार [] संदर्भ है तो हमें अतिरिक्त '&' जोड़ने की आवश्यकता क्यों है? – MDman

+12

@MDman: 'auto' शीर्ष-स्तर सीवी और संदर्भ को हटा देता है, यह प्रयुक्त प्रकार" decays "करता है। – Xeo

13

बनाने के लिए के रूप में बो ने कहा कि बजाय यह प्रयास करें, आप (अन्य मामलों के लिए भी auto* होता है, नोट) auto& बजाय auto उपयोग करना होगा। यहाँ अपने कोड के एक अद्यतन संस्करण है:

#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); 
} 

अपने कंप्यूटर पर, यह निम्न उत्पादन देता है:

100000 x func: 0 sec. 
100000 x func: 3.136 sec. 
100000 x func: 0 sec. 
संबंधित मुद्दे