БлогNot. char * и string - что быстрее в Debug-конфигурации?

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 заметной разницы во времени не будет.


теги: textprocessing тест c++ время studio

05.10.2015, 17:15; рейтинг: 6013