std :: cin действительно медленный
Поэтому я пытался написать команду для конвейера Linux. Думайте об этом как о копии gnu 'cat' или 'sed', которая принимает входные данные от stdin, выполняет некоторую обработку и пишет в stdout.
Первоначально я написал сценарий AWK, но хотел большей производительности, поэтому я использовал следующий код C ++:
std::string crtLine;
crtLine.reserve(1000);
while (true)
{
std::getline(std::cin, crtLine);
if (!std::cin) // failbit (EOF immediately found) or badbit (I/O error)
break;
std::cout << crtLine << "\n";
}
Это именно то, что делает кошка (без каких-либо параметров). Оказывается, эта программа примерно такая же медленная, как и ее аналог на awk, и далеко не такая быстрая, как cat.
Тестирование на файле 1 ГБ:
$time cat 'file' | cat | wc -l
real 0m0.771s
$time cat 'file' | filter-range.sh | wc -l
real 0m44.267s
Вместо getline (istream, string) я попробовал cin.getline (buffer, size), но без улучшений. Это смущает, это проблема буферизации? Я также попытался получить 100 КБ за раз вместо одной строки, без помощи! Есть идеи?
РЕДАКТИРОВАТЬ: То, что вы, ребята, говорите, имеет смысл, НО преступник не строит / копирует строки и не сканирует строки. (И не размер буфера). Взгляните на эти 2 программы:
char buf[200];
while (fgets(buf, 200, stdin))
std::cout << buf;
$time cat 'file' | ./FilterRange > /dev/null
real 0m3.276s
char buf[200];
while (std::cin.getline(buf, 200))
std::cout << buf << "\n";
$time cat 'file' | ./FilterRange > /dev/null
real 0m55.031s
Ни один из них не манипулирует строками, и оба они выполняют сканирование новой строки, однако одно в 17 раз медленнее, чем другое. Они отличаются только использованием Cin. Я думаю, что мы можем с уверенностью сделать вывод, что cin портит время.