在Visual Studio 2010中使用"auto"关键字的性能损失

MDm*_*man 30 c++ performance visual-studio-2010 c++11

使用new auto关键字会降低我的代码执行时间.我将问题缩小到以下简单的代码片段:

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

}
Run Code Online (Sandbox Code Playgroud)

我在i7/Win7机器上的输出(发布模式; VS2010)是:

100000 x func1: 0.001 sec.
100000 x func2: 3.484 sec.
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么auto在不同的执行时间内使用结果?

显然,有一个简单的解决方法,即auto完全停止使用,但我希望有更好的方法来克服这个问题.

Bo *_*son 34

您正在将矢量复制到v.

请尝试使用此选项来创建引用

auto& v = ...
Run Code Online (Sandbox Code Playgroud)

  • @MDman:`auto`删除顶级cv和引用,它"衰减"推导出的类型. (12认同)
  • @MDman:另外,如果推断的类型总是完全是表达式的类型,你怎么能够创建一个副本?:)我认为这是让'auto`以这种方式表现的理由之一. (5认同)

And*_*dre 13

正如Bo所说,你必须使用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);
}
Run Code Online (Sandbox Code Playgroud)

在我的计算机上,它提供以下输出:

100000 x func: 0 sec.
100000 x func: 3.136 sec.
100000 x func: 0 sec.
Run Code Online (Sandbox Code Playgroud)