C ++ map & lt; std :: string & gt; vs Karte & lt; char * & gt; Leistung (ich weiß, "wieder?")

War ich mit einer Karte mit einem std::string - Taste und während alles gut funktioniert, ich war nicht immer die Leistung, die ich erwartet hatte. Ich habe nach Orten gesucht, um zu optimieren und verbessert die Dinge nur ein wenig und das ist, wenn ein Kollege sagte:", string key wird langsam sein."

Las ich Dutzende von Fragen, und Sie konsequent zu sagen:

"nicht mit einem char * als Schlüssel"
"std::string Schlüssel werden nie Ihren Engpass"
"der performance-Unterschied zwischen einem char * und ein
std::string ist ein Mythos."

Ich widerwillig versuchte ein char * Schlüssel und es war ein Unterschied, ein großer Unterschied.

Ich kochte das problem auf ein einfaches Beispiel:

#include <stdio.h>
#include <stdlib.h>
#include <map>

#ifdef USE_STRING

#include <string>
typedef std::map<std::string, int> Map;

#else

#include <string.h>
struct char_cmp { 
    bool operator () (const char *a,const char *b) const 
    {
        return strcmp(a,b)<0;
    } 
};
typedef std::map<const char *, int, char_cmp> Map;

#endif

Map m;

bool test(const char *s)
{
    Map::iterator it = m.find(s);
    return it != m.end();
}

int main(int argc, char *argv[])
{
    m.insert( Map::value_type("hello", 42) );

    const int lcount = atoi(argv[1]);
    for (int i=0 ; i<lcount ; i++) test("hello");
}

Ersten std::string version:

$ g++ -O3 -o test test.cpp -DUSE_STRING
$ time ./test 20000000
real    0m1.893s

Neben der 'char *' - version:

g++ -O3 -o test test.cpp             
$ time ./test 20000000
real    0m0.465s

Dass ist eine ziemlich große performance-Unterschied und zu den gleichen Unterschied, den ich in meinem größeren Programm.

Mit einem char * Schlüssel ist ein Schmerz zu behandeln und befreien den Schlüssel und fühlt sich einfach nicht richtig. C++ Experten was bin ich? Irgendwelche Gedanken oder Anregungen?

InformationsquelleAutor der Frage uroc | 2012-08-27

Schreibe einen Kommentar