Снижение производительности при использовании ключевого слова auto в Visual Studio 2010 - PullRequest
30 голосов
/ 13 декабря 2011

Использование нового ключевого слова 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;

}

Вывод, который я получаю на своем компьютере с i7 / Win7 (режим выпуска; VS2010):

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

Может кто-нибудь объяснитьпочему использование auto приводит к такому разному времени выполнения?

Очевидно, что существует простой обходной путь, т. е. вообще не использовать auto, но я надеюсь, что есть лучший способ преодолеть эту проблему.

Ответы [ 2 ]

34 голосов
/ 13 декабря 2011

Вы копируете вектор в v.

Попробуйте вместо этого создать ссылку

auto& v = ...
13 голосов
/ 13 декабря 2011

Как сказал Бо, вы должны использовать 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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...