clang ++ в 10 раз медленнее, чем g ++

В: Есть ли способ ускорить потоки Clang ++ STD Library? (А кто-нибудь знает, почему он намного медленнее, чем g ++?)

Я пытаюсь обработать очень большие (много ГБ) файлы двоичных данных и с удивлением обнаружил, что производительность оказалась настолько низкой. Сначала я подумал, что это как-то связано с моим кодом. Но я вижу ту же медленную производительность в пригнанном примере.

Я даже пытался выделить буферы разного размера через rdbuf () -> pubsetbuf (), но это, похоже, не имело большого эффекта.

Вот простой пример ввода / вывода:

#include <fstream>

int main() {
    std::ifstream is {"bigSourceFile"};
    std::ofstream os {"bigSourceFileCopy"};

    std::string line;
    while (std::getline (is, line) ) {
        os << line;
    }
}

Вот некоторый код для создания исходного файла объемом 1,3 ГБ. Используйте это, чтобы сгенерировать исходный файл для программы readWrite:

#include <fstream>
#include <string>

std::string createTailStr () {
    std::string result {"__"};
    for (auto i (0); i< 58; ++i) {
        result += 'A'+i;
    }

    return result;
}

int main() {

    std::string tail {createTailStr()};

    std::ofstream os {"bigSourceFile"};

    constexpr auto Lines (20000000ul);
    for (auto i (0); i < Lines; ++i) {
        os << i << tail << '\n';
    }
}

На моей машине (под управлением OSX El Capitan и последней версии Xcode): пример (первый список кодов) занимает приблизительно. 50 секунд для запуска компиляции из командной строки:

clang ++ -std = c ++ 11 -o readWrite readWrite.cpp

Однако при компиляции с использованием g ++ и его libstdc ++ программа занимает всего около 5 секунд.

Я даже собрал последнюю версию llvm stdc ++ из llvm.org, и эта сборка была еще медленнее (примерно 90 секунд).

Подводя итог: лязг ++: 50 секунд; г ++: 5 секунд

 Tal29 июл. 2016 г., 02:09
@Galik - спасибо за исправление. Я заменил STL для стандартной библиотеки.
 n.m.29 июл. 2016 г., 02:40
Если вы обрабатываете двоичные данные, что<< а также>> делаете в своем коде?
 Galik28 июл. 2016 г., 01:01
fstreams не являются частьюSTL который относится только кalgorithms, containers а такжеiterators элементы.
 Tal29 июл. 2016 г., 02:27
@RichardHodges - Да, для этого конкретного случая -O3 оказывает заметное влияние. Я видел 16 секунд по сравнению с 50 секундами. Однако в оригинальном коде это было не так уж важно. Так что я не думал пробовать что-либо, кроме настроек по умолчанию для этого примера.
 Tal29 июл. 2016 г., 02:15
@ Тим - Не совсем. Я использовал: 'clang ++ -std = gnu ++ 11 -stdlib = libstdc ++', чтобы подобрать libstdc ++. В этом примере clang ++ -std = c ++ 11 -stdlib = libstdc ++ 'тоже работает. Однако, как правило, я не имел большого успеха в смешивании libstdc ++ без -std = gnu ++ 11.
 n.m.29 июл. 2016 г., 03:21
@RudyVelthuis двоичные данные не имеют строк. Текст имеет строки. Если кто-то обрабатывает двоичные данные, не имеет смысла тестировать средства, предназначенные для обработки форматированного текста.
 Rudy Velthuis29 июл. 2016 г., 08:24
Ну да, код показывает, что это так.
 M4rc28 июл. 2016 г., 01:16
Какие параметры компилятора включены по умолчанию? Особенно уровни оптимизации.
 Rudy Velthuis29 июл. 2016 г., 03:00
@ n.m .: Взгляните на второй кусок исходного кода. Он говорит вам строки, которые написаны. Это текст ASCII. Я думаю, что getline () также может быть подсказкой.
 Tim28 июл. 2016 г., 01:06
Вы пытались использовать clang с libstdc ++?clang++ -stdlib=libstdc++
 Richard Hodges28 июл. 2016 г., 01:43
на моем Mac (Clang) с включенной оптимизацией,time taken: 14 seconds
 Rudy Velthuis29 июл. 2016 г., 03:03
@Tal: что показывает "gcc --version"? В моем случае это та же строка, что и clang, clang ++ и g ++, то есть то, что я показал в своем другом комментарии.
 Rudy Velthuis28 июл. 2016 г., 02:05
FWIW, на моем Mac с Xcode 7.3, компиляторыg++, gcc, clang++ а такжеclang похоже, все они отображаются на один и тот же компилятор clang:Apple LLVM version 7.3.0 (clang-703.0.29), который вInstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin.
 Tal29 июл. 2016 г., 02:34
@RudyVelthuis - я использую Xcode 7.3.1 (clang-7.3.0.7030031). Clang ++ указывает на лязг. Однако g ++ / gcc основан на 4.2.1. Я обычно компилирую для g ++: «clang ++ -std = gnu ++ 11 -stdlib = libstdc ++».
 n.m.29 июл. 2016 г., 04:14
@RudyVelthuis OP говорит: «Я пытаюсь обработать очень большие (много ГБ)двоичный файлы данных ", а потом это вдруг текст.
 Tal29 июл. 2016 г., 02:24
@ M4c - Время указано с параметрами по умолчанию. В моем исходном коде оптимизации не помогли более чем на несколько процентов. Тем не менее, для этого использование -O3, имеет немного больше влияния. Время сократилось с 50 до 16 секунд.
 Rudy Velthuis29 июл. 2016 г., 03:25
@ N.m. Именно так. Так что это явно текст. И именно поэтому в коде есть << и >>.

Ответы на вопрос(0)

Ваш ответ на вопрос