Cin или printf?

во время работы в c/С++,

1.cin/соиЬ  или 2.scanf/printf,

который один из них, будет иметь меньшее время выполнения или время выполнения. ИЛИ оба будут иметь равное время выполнения.

Моя цель - сократить время выполнения моего кода.

Ответы

Ответ 1

Чтобы сделать ставку на относительные тайминги функций консоли IO, это imho без какого-либо реального использования. Это совершенно непредсказуемо (зависит от окружающей среды). Консольный выход полностью зависит от скорости консоли и обычно не от скорости печати /cout. Попробуйте использовать локальный вывод файла вместо вывода консоли.

Ответ 2

Правило эффективности № 1 - измерьте, а затем оптимизируйте

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

Ответ 3

Так как никто еще не упомянул об этом, здесь приходит запоздалый ответ:
С++ 'IO-потоки безопасны. Когда вы хотите распечатать double, компилятор узнает об этом double и вставляет вызов правильной перегрузки operator<<() во время компиляции. С помощью функций C IO, OTOH, вы должны указывать типы вручную и, следовательно, можете легко делать ошибки, которые попадают только во время выполнения. (Просто сделайте std::printf("%d", 47.11), и вы глубоко в Undefined Поведение земли.)

О да, это и: любой из этих двух может легко идти в ногу с консолью. Поэтому напишите код, который легко получить правильно и легко понять первым. Затем измерьте. И когда вы (несколько удивительно) узнали, что этот код действительно является проблемой, посмотрите, можно ли его улучшить, изменив. Но только тогда.

Ответ 4

Ранние реализации С++ iostreams, как правило, заметно медленнее, чем их C-копии. Однако это не так долго. Если вы не используете относительно старый компилятор/библиотеку, скорее всего, они близки к одной и той же скорости в целом (хотя, если вы измеряете, вы можете обнаружить, что один быстрее, чем другой, в некоторых конкретных обстоятельствах или в другом - наверняка видел несколько таких).

Нижняя строка: если вы хотите улучшить производительность, это, вероятно, не одно из первых мест для поиска.

Ответ 5

По моему опыту, речь идет не о производительности, а о возможностях. cout и cin имеют приложения, которые fprintf и fscanf очень сложны в использовании. Однако форматирование часто проще с fprintf чем cout. Сосредоточьте на прочности и правильности перед профилированием.

Для производительности блок ввода-вывода работает быстрее, чем форматированный ввод-вывод. Например:

#include <iostream>
#include <cstdio>

using namespace std; // Because I'm lazy right now. :-)

int main(void)
{
  static const char  some_text[] = "This is kinda long, but anything will do.\n";

  // The "fast" method using block writes:
  cout.write(some_text,
             sizeof(some_text) - sizeof('\0')); // Remove trailing nul from the length.

  // The slow method, using formatted write:
  cout << some_text;

  // Using the C language techniques:
  fwrite(some_text,
         sizeof(some_text) - sizeof('\0'),
         1,
         stdout);

  // Another fast method but slower than above:
  puts(some_text);

  // Finally, the slow method:
  fprintf(stdout, some_text);

  return 0;
}

При настройке производительности программы на основе cout/cin vs. printf/scanf необходимо учитывать, что большая часть времени или узкое место не связана с программой, а с операционной системой. Операционная система имеет множество накладных расходов для управления при печати, таких как управление ресурсами (это другая задача с использованием ресурса), переключение контекстов и т.д. Поэтому, если вы хотите, чтобы ваша программа работала быстрее, используйте меньше запросов ввода-вывода. Если возможно, объедините несколько небольших запросов в один большой.

Ответ 6

Профилирование - ваш друг; нет ни одного правильного ответа, это зависит от вашего конкретного шаблона использования и платформы.

Ответ 7

Пока вы не профилировали свой код, выбирая один из них, не более чем догадываясь. Лучший подход здесь - сначала выбрать более удобную функцию. После более позднего профилирования он обнаруживает, что это проблема, а затем переключиться на более быструю функцию.