Я обнаружил, что std::string
очень медленный по сравнению со старыми строками с нулевым завершением, настолько медленными, что они значительно замедляют мою общую программу в 2 раза.
Я ожидал, что STL будет медленнее, я не понимал, что это будет намного медленнее.
Я использую Visual Studio 2008, режим выпуска. Он показывает назначение строки в 100-1000 раз медленнее, чем char*
присвоение (очень сложно проверить время выполнения задания char*
). Я знаю, что это не справедливое сравнение, назначение указателя и строковая копия, но моя программа имеет множество назначений строк, и я не уверен, что могу использовать трюк "const reference" во всех местах. С реализацией подсчета ссылок моя программа была бы прекрасной, но эти реализации, похоже, больше не существуют.
Мой реальный вопрос: почему люди больше не используют реализаций подсчета ссылок, и значит ли это, что все мы должны быть гораздо более осторожными, чтобы избежать общих ошибок производительности std::string?
Мой полный код приведен ниже.
#include <string>
#include <iostream>
#include <time.h>
using std::cout;
void stop()
{
}
int main(int argc, char* argv[])
{
#define LIMIT 100000000
clock_t start;
std::string foo1 = "Hello there buddy";
std::string foo2 = "Hello there buddy, yeah you too";
std::string f;
start = clock();
for (int i=0; i < LIMIT; i++) {
stop();
f = foo1;
foo1 = foo2;
foo2 = f;
}
double stl = double(clock() - start) / CLOCKS\_PER\_SEC;
start = clock();
for (int i=0; i < LIMIT; i++) {
stop();
}
double emptyLoop = double(clock() - start) / CLOCKS_PER_SEC;
char* goo1 = "Hello there buddy";
char* goo2 = "Hello there buddy, yeah you too";
char *g;
start = clock();
for (int i=0; i < LIMIT; i++) {
stop();
g = goo1;
goo1 = goo2;
goo2 = g;
}
double charLoop = double(clock() - start) / CLOCKS_PER_SEC;
cout << "Empty loop = " << emptyLoop << "\n";
cout << "char* loop = " << charLoop << "\n";
cout << "std::string = " << stl << "\n";
cout << "slowdown = " << (stl - emptyLoop) / (charLoop - emptyLoop) << "\n";
std::string wait;
std::cin >> wait;
return 0;
}