2016-12-14 5 views
0

Мой C код:Почему C++ намного быстрее, чем C в этом коде?

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

int main(void){ 
    char* a = (char*)malloc(200000); 
    for (int i = 0;i< 100000;i++){ 
    strcat(a,"b"); 
    } 
    printf("%s",a); 
} 

Мой C++ кода

#include <iostream> 
int main(void){ 
    std::string a = ""; 
    for (int i = 0;i< 100000;i++){ 
    ¦ a+="b"; 
    } 

    std::cout<<a; 
} 

На моей машине, код C работает примерно 5 секунд, в то время как на моей машине код, С ++ работает в 0.025! секунд.

Теперь код C не проверяет наличие переполнения, не имеет накладных расходов C++, классов и все же на несколько величин медленнее, чем мой код на C++.

Использование gcc/g ++ 6.2.0, скомпилированное с -O3 на малине Pi.

+0

Вероятно, потому что 'strcat()' является библиотечной функцией, которая не будет встроена, тогда как 'std :: string' является (специализацией) шаблоном, поэтому операции - в зависимости от настроек оптимизации - скорее всего, будут встраиваемый. Существует также тот факт, что ваша версия C динамически выделяет гораздо больший буфер, чем требуется, и, в зависимости от доступных ресурсов вашей системы, может замедлить работу. Обратите внимание, что ваш код на C++ не может быть скомпилирован, поскольку '' не требуется определять 'std :: string'. – Peter

+0

Я бы предположил, что C использует строку с нулевым завершением, поэтому 'strcat' выполняет поиск конца строки. Строка C++ не требует этого, и поэтому конкатенация выполняется намного быстрее. –

+0

@ErwinKalvelagen Wow. Алгоритм краски Шлемиеля на работе –

ответ

0

@erwin был верным.

Когда я изменить мой код

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
void mystrcat(char* src,char* dest,int lenSrc){ 
    src[lenSrc]=dest[0]; 
} 
int main(void){ 
    char* a = (char*)malloc(200000); 
    for (int i = 0;i< 100000;i++){ 
    mystrcat(a,"b",i); 
    } 
    a[100000] = 0; 
    printf("%s\n",a); 
} 

Она занимает около .012s для запуска (в основном печати на большом экране).

Shlemiel's the painter's algorithm на работе!

Смежные вопросы