Чтение cin медленная

По умолчанию чтение с cin она отчаянно медленная по сравнению с Вашим синонимом scanf... когда логика говорит нам, что это должный быть быть так:

  • С cin делается прямой призыв к функции, которую он знает каковой, - тип изменчивая судьба.
  • С scanf функция должна читать цепь формата (с десятками возможностей, которые существуют), чтобы знать, как он должен интерпретировать ввод и потом обрабатывать ее.

Однако с простым примером легко видеть, что реальность отличается:

#include <iostream>
#include <chrono>
#include <string>

void cinFunc()
{
  int N;
  for( int i=0; i<100000; i++)
    std::cin >> N;
}

void scanfFunc()
{
  int N;
  for( int i=0; i<100000; i++)
    scanf(" %d",&N);
}


template<typename Func>
void Test(std::string const& title, Func f)
{
  auto start = std::chrono::steady_clock::now();
  f();
  auto end = std::chrono::steady_clock::now();
  auto diff = end - start;
  std::cout << "Test " << title << ":\t" << std::chrono::duration<double, std::milli>(diff).count() << " ms\n";
}

int main()
{
  Test("cin",cinFunc);
  Test("scanf",scanfFunc);
  return EXIT_SUCCESS;
}

Программа работает с файлом, который содержит 200.000 целых чисел 1 цифры, отделенных местом, и результаты говорят сами:

Test cin:       64.7967 ms
Test scanf:     49.855 ms

Какова причина того, что собственное чтение C ++ такое медленное? Как возможно исправлять эту ситуацию?

7
задан 22.06.2017, 16:43
0 ответов