Я использовал карту с ключом std::string
, и пока все работало нормально, я не получал ожидаемого результата. Я искал места для оптимизации и улучшения всего лишь немного, и когда коллега сказал: "Этот строковый ключ будет медленным".
Я читал десятки вопросов, и они последовательно говорят:
"не использовать
char *
как ключ"
"std::string
ключи никогда не являются вашим узким местом"
"разница в производительности между achar *
иstd::string
- это миф."
Я неохотно попробовал ключ char *
, и была разница, большая разница.
Я сварил проблему до простого примера:
#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");
}
Сначала версия std::string:
$ g++ -O3 -o test test.cpp -DUSE_STRING
$ time ./test 20000000
real 0m1.893s
Далее версия 'char *':
g++ -O3 -o test test.cpp
$ time ./test 20000000
real 0m0.465s
Это довольно большая разница в производительности и примерно та же разница, что и в моей более крупной программе.
Использование клавиши char *
- это боль, чтобы справиться с освобождением ключа и просто не чувствует себя хорошо. Эксперты С++, что мне не хватает? Любые мысли или предложения?