2011-12-13 26 views
30

Sử dụng từ khóa auto mới đã làm giảm thời gian thực thi mã của tôi. Tôi thu hẹp vấn đề đối với đoạn mã đơn giản sau đây:Hình phạt hiệu suất sử dụng từ khóa 'tự động' trong Visual Studio 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; 

} 

Kết quả tôi nhận được trên i7 của tôi/máy Win7 (chế độ Release; VS2010) là:

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

bất cứ ai có thể giải thích lý do tại sao sử dụng auto kết quả trong một thời gian thực hiện khác nhau như vậy?

Rõ ràng, có cách giải quyết đơn giản, tức là, ngừng sử dụng auto hoàn toàn, nhưng tôi hy vọng có cách tốt hơn để khắc phục vấn đề này.

Trả lời

34

Bạn đang sao chép vectơ sang v.

Hãy thử điều này thay vì để tạo ra một tài liệu tham khảo

auto& v = ... 
+1

Chết tiệt, bạn phải thật nhanh để trả lời những câu hỏi đó. ;-) – Andre

+0

Tôi nghĩ (nhưng tôi đoán tôi đã sai) tự động sử dụng kiểu trả về của hàm. Kiểu trả về của toán tử [] là tham chiếu, vậy tại sao chúng ta cần phải thêm '&' bổ sung? – MDman

+12

@MDman: 'auto' loại bỏ cv và tham chiếu cấp cao nhất, nó" phân rã "loại suy luận. – Xeo

13

Như Bo cho biết, bạn phải sử dụng auto& thay vì auto (Lưu ý, đó cũng auto* là đối với trường hợp khác). Dưới đây là một phiên bản cập nhật của mã của bạn:

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

Trên máy tính của tôi, nó mang lại kết quả như sau:

100000 x func: 0 sec. 
100000 x func: 3.136 sec. 
100000 x func: 0 sec. 
Các vấn đề liên quan