std :: cin muito lento

Então eu estava tentando escrever um comando para um pipeline de linux. Pense nisso como uma réplica do gnu 'cat' ou 'sed', que recebe a entrada do stdin, faz algum processamento e grava no stdou

Eu escrevi originalmente um script AWK, mas queria mais desempenho, então usei o seguinte código 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";
}

Este é exatamente o que gato (sem nenhum parâmetro). Acontece que este programa é tão lento quanto seu equivalente inábil e nem tão rápido quanto o gat

Teste de um arquivo de 1 GB:

$time cat 'file' | cat | wc -l
real    0m0.771s

$time cat 'file' | filter-range.sh | wc -l
real    0m44.267s

Em vez de getline (istream, string) Eu tentei cin.getline (buffer, tamanho), mas sem melhorias. Isso é embaraçoso, é um problema de buffer? Também tentei buscar 100 KB de cada vez, em vez de apenas uma linha, sem ajuda! Alguma ideia

EDIT: O que vocês dizem faz sentido, mas o culpado não é a criação / cópia de cadeias e nem a busca de novas linhas. (E também não é o tamanho do buffer). Dê uma olhada nestes 2 programas:

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

Nenhum deles manipula seqüências de caracteres e faz a varredura de nova linha; no entanto, um é 17 vezes mais lento que o outro. Eles diferem apenas pelo uso de cin. Acho que podemos concluir com segurança que o cin estraga o temp

questionAnswers(8)

yourAnswerToTheQuestion