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 секунд