As duas chamadas têm significados diferentes que nada têm a ver com desempenho; o fato de acelerar o tempo de execução é (ou pode ser ) apenas um efeito colateral. Você deve entender o que cada um deles faz e não os incluir cegamente em todos os programas, porque eles parecem uma otimização.
ios_base::sync_with_stdio(false);
Isso desativa a sincronização entre os fluxos padrão C e C ++. Por padrão, todos os fluxos padrão são sincronizados, o que, na prática, permite misturar E / S no estilo C e C ++ e obter resultados esperados e sensíveis. Se você desativar a sincronização, os fluxos C ++ poderão ter seus próprios buffers independentes, o que torna uma mistura de E / S nos estilos C e C ++.
Lembre-se também de que os fluxos C ++ sincronizados são seguros para threads (a saída de diferentes threads pode se intercalar, mas você não obtém corridas de dados).
cin.tie(NULL);
Isso desata cin
de cout
. Os fluxos vinculados garantem que um fluxo seja liberado automaticamente antes de cada operação de E / S no outro fluxo.
Por padrão, cin
está vinculado cout
a garantir uma interação sensata do usuário. Por exemplo:
std::cout << "Enter name:";
std::cin >> name;
Se cin
e cout
estiver empatado, você pode esperar que a saída seja liberada (ou seja, visível no console) antes que o programa solicite a entrada do usuário. Se você desatar os fluxos, o programa poderá bloquear a espera do usuário digitar seu nome, mas a mensagem "Enter name" ainda não está visível (porque cout
é armazenada em buffer por padrão, a saída é liberada / exibida no console somente sob demanda ou quando o buffer está cheio).
Então, se você desatar cin
a partir cout
, você deve certificar-se para lavar cout
manualmente cada vez que você deseja exibir algo antes de esperar a entrada em cin
.
Em conclusão, saiba o que cada um deles faz, entenda as conseqüências e decida se você realmente deseja ou precisa do possível efeito colateral da melhoria da velocidade.