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