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