char * и string - что быстрее в Debug-конфигурации?
Замечание к небольшой дискуссии по C++... по-моему, встроенный тип никак не может быть медленнее класса, экземпляр которого надо создать вместе с кучей всего, что туда напихано... Вот 2 эквивалентных ветки заведомо несовершенного кода, решающих одинаковую задачу - копирование строки в другую строку, которая динамически создаётся в цикле 1000000 раз. У меня в пустом консольном проекте Studio 2010 код с классом (ветка 2) выполняется в 2,5-3 раза медленнее. То ли ещё будет, когда .NET дойдёт до какой-нибудь пятой версии :)
#include <iostream> #include <cstring> #include <string> #include <time.h> using namespace std; int main() { int n=1; cout << "Select C(1) or C++(2)"; cin >> n; long t1 = clock(); if (n==1) { int errors = 0; const char *pc = "a very long literal string"; for ( int ix = 0; ix < 1000000; ++ix ) { int len = strlen( pc ); char *pc2 = new char[ len + 1 ]; strcpy( pc2, pc ); if ( strcmp( pc2, pc )) ++errors; delete [] pc2; } cout << "C-string: " << errors << " error(s)\n"; } else { int errors = 0; string str( "a very long literal string" ); for ( int ix = 0; ix < 1000000; ++ix ) { int len = str.size(); string str2 (str); //или string str2 = str; if ( str != str2 ) ++errors; } cout << "C++ class: " << errors << " error(s)\n"; } long t2 = clock(); cout << t2 - t1 << " ms" << endl; cin.sync(); cin.get(); return 0; }
P.S. Не будет, а уже есть. Приведённая в статье разница быстродействия - это на Studio 2010 и 64-разрядной системе. В Studio 2015 и на другом "железе" разница в скорости выполнения достигла и 8-10 раз в пользу классических строк. Вот соответствующий листинг для Studio 2015, в нём strcpy
, на которую среда ругается даже при включённой директиве
#define _CRT_SECURE_NO_WARNING
заменена "прямым" посимвольным копированием строки char *
.
//Копируем миллион раз и проверям результат копирования //классическими строками и классом string //Версия для Studio 2015 // 460 мс - C-строки //8468 мс - класс string //почти в 20 раз медленнее #define _CRT_SECURE_NO_WARNING #include <iostream> #include <cstring> #include <string> #include <time.h> using namespace std; int main() { int n = 1; cout << "Select C(1) or C++(2)"; cin >> n; long t1 = clock(); if (n == 1) { int errors = 0; const char *pc = "a very long literal string"; for (int ix = 0; ix < 1000000; ++ix) { int len = strlen(pc); char *pc2 = new char[len + 1]; // копируем вручную вместо устаревшей strcpy for (int i = 0; i <= len; i++) *pc2++ = *pc++; pc2 -= len + 1; //с нуль-терминатором! pc -= len + 1; // конец копирования if (strcmp(pc2, pc)) ++errors; delete[] (pc2); } cout << "C-string: " << errors << " error(s)\n"; } else { int errors = 0; string str("a very long literal string"); for (int ix = 0; ix < 1000000; ++ix) { int len = str.size(); string str2(str); //или string str2 = str; if (str != str2) ++errors; } cout << "C++ class: " << errors << " error(s)\n"; } long t2 = clock(); cout << t2 - t1 << " ms" << endl; cin.sync(); cin.get(); cin.get(); return 0; }
Обратите внимание, что всё сказанное верно только для Debug-конфигураций IDE, в конфигурациях Release заметной разницы во времени не будет.
05.10.2015, 17:15 [7085 просмотров]