C ++ намного быстрее, чем запись сценария Bash в текстовый файл

17

Я хотел протестировать производительность записи в файл в скрипте bash по сравнению с программой на C ++.

Вот сценарий bash:

#!/bin/bash

while true; do
        echo "something" >> bash.txt
done

Это добавило около 2-3 КБ к текстовому файлу в секунду.

Вот код C ++:

#include <iostream>
#include <fstream>

using namespace std;

int main() {
    ofstream myfile;
    myfile.open("cpp.txt");

    while (true) {
        myfile << "Writing this to a file Writing this to a file \n";
    }

    myfile.close();
}

Это создало текстовый файл размером ~ 6 ГБ менее чем за 10 секунд.

Что делает этот код на C ++ намного быстрее и / или этот скрипт bash настолько медленнее?

    
задан obl 04.07.2017 в 20:31
источник

3 ответа

38

Есть несколько причин.

Во-первых, интерпретируемые среды исполнения (например, bash , perl наряду с не-JITed lua и python и т. д.), как правило, намного медленнее, чем даже плохо написанные скомпилированные программы ( C , C++ и т. д.).

Во-вторых, обратите внимание, как фрагментированный ваш код bash - он просто записывает строку в файл, затем записывает еще одну и так далее. Ваша программа на C ++, с другой стороны, выполняет буферизированную запись - даже без ваших прямых усилий. Вы можете увидеть, как будет работать медленнее, если вы замените

myfile << "Writing this to a file Writing this to a file \n";

с

myfile << "Writing this to a file Writing this to a file" << endl;

для получения дополнительной информации о том, как потоки реализованы на C ++ и почему \n отличается от endl , см. любую справочную документацию на C ++.

В-третьих, как показывают комментарии, ваш скрипт bash выполняет открытие / закрытие целевого файла для каждой строки. Это подразумевает значительные накладные расходы по производительности - представьте, что myfile.open и myfile.close перемещены внутри вашего тела цикла!

    
ответ дан iehrlich 04.07.2017 в 20:37
источник
6

Как уже указывали другие, это происходит потому, что вы открываете и закрываете файл с каждой строкой, которую вы пишете в своем скрипте (и интерпретаторы оболочки интерпретируются при компиляции C ++). Вы можете выполнять пакетную запись и писать один раз, например

MSG="something"
logfile="test.txt"
(
for i in {1..10000}; do
        echo $MSG
done
) >> $logfile

Что будет писать сообщение 10k раз, но только один раз открыть журнал.

    
ответ дан Elliott Frisch 05.07.2017 в 05:33
источник
-3

Скомпилированные или интерпретируемые языки

Bash интерпретируется при компиляции C ++. Просто это делает его намного быстрее

    
ответ дан Reece Ward 04.07.2017 в 20:36
источник