30 votes

Baisse de performance lors de l'utilisation du mot clé "auto" dans Visual Studio 2010

En utilisant le nouveau auto a dégradé les temps d'exécution de mon code. J'ai trouvé le problème dans le simple extrait de code suivant :

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

}

Le résultat que j'obtiens sur ma machine i7 / Win7 (mode Release ; VS2010) est le suivant :

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

Quelqu'un peut-il expliquer pourquoi utiliser auto entraîne des temps d'exécution si différents ?

Il existe évidemment une solution de contournement simple, à savoir cesser d'utiliser auto tout à fait, mais j'espère qu'il existe un meilleur moyen de surmonter ce problème.

34voto

Bo Persson Points 42821

Vous copiez le vecteur dans v .

Essayez plutôt ceci pour créer une référence

auto& v = ...

13voto

Andre Points 1135

Comme Bo l'a dit, vous devez utiliser auto& au lieu de auto (Notez qu'il existe également auto* pour les autres cas). Voici une version actualisée de votre code :

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

Sur mon ordinateur, le résultat est le suivant :

100000 x func: 0 sec.
100000 x func: 3.136 sec.
100000 x func: 0 sec.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X