Используя scanf () в программах C++ быстрее, чем использование cin?

Вот мой ответ, который я использовал в своем приложении. Он показывает текст в центре экрана.

<TextView
    android:id="@+id/txtSubject"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/subject"
    android:layout_margin="10dp"
    android:gravity="center"
    android:textAppearance="?android:attr/textAppearanceLarge" />
113
задан Wayne Koorts 25 June 2009 в 04:05
поделиться

7 ответов

Вероятно, scanf работает несколько быстрее, чем использование потоков. Хотя потоки обеспечивают большую безопасность типов и не должны анализировать строки формата во время выполнения, обычно у них есть то преимущество, что они не требуют чрезмерного выделения памяти (это зависит от вашего компилятора и времени выполнения). Тем не менее, если производительность не является вашей единственной конечной целью и вы не находитесь на критическом пути, вам действительно следует отдавать предпочтение более безопасным (более медленным) методам.

Здесь есть очень вкусная статья, написанная Хербом Саттером » The String Formatters из Manor Farm ", который подробно описывает работу таких программ форматирования строк, как sscanf и lexical_cast , а также то, что заставляло их работать медленно или быстро. Это вроде аналогично, вероятно, к тем вещам, которые могут повлиять на производительность между стилями ввода-вывода C и стилем C ++. Основное различие с форматерами, как правило, заключается в безопасности типов и количестве выделений памяти.

42
ответ дан 24 November 2019 в 02:39
поделиться

Существуют реализации stdio ( libio ), которые реализуют FILE * как streambuf C ++ и fprintf как синтаксический анализатор формата времени выполнения. Потоки ввода-вывода не нуждаются в синтаксическом анализе формата времени выполнения, все это делается во время компиляции. Итак, с общими бэкэндами, разумно ожидать, что iostreams будет быстрее во время выполнения.

2
ответ дан 24 November 2019 в 02:39
поделиться

Если вам важны как производительность, так и форматирование строк, обратите внимание на FastFormat Мэтью Уилсона библиотека.

edit - ссылка на публикацию в этой библиотеке: http://accu.org/index.php/journals/1539

6
ответ дан 24 November 2019 в 02:39
поделиться

Проблема в том, что cin имеет много накладных расходов, потому что он дает вам уровень абстракции выше scanf () звонков. Вы не должны использовать scanf () вместо cin , если вы пишете программное обеспечение на C ++, потому что это want cin для. Если вам нужна производительность, вы, вероятно, все равно не будете писать ввод-вывод на C ++.

1
ответ дан 24 November 2019 в 02:39
поделиться

Даже если бы scanf был быстрее, чем cin , это не имело бы значения. В большинстве случаев вы будете читать с жесткого диска или клавиатуры. Загрузка необработанных данных в ваше приложение занимает на порядки больше времени, чем требуется scanf или cin для их обработки.

-1
ответ дан 24 November 2019 в 02:39
поделиться

Я только что провел вечер, работая над проблемой в UVa Online (Factovisors, очень интересная проблема, проверьте это):

http://uva.onlinejudge.org/index. php? option = com_onlinejudge & Itemid = 8 & category = 35 & page = show_problem & problem = 1080

Я получал TLE (превышен лимит времени) на мои заявки. На этих сайтах онлайн-судей по решению проблем у вас есть ограничение по времени в 2-3 секунды, чтобы обработать потенциально тысячи тестовых примеров, используемых для оценки вашего решения. Для таких ресурсоемких задач, как эта, на счету каждая микросекунда.

Я использовал предложенный алгоритм (читайте об этом в дискуссионных форумах сайта), но все еще получал TLE.

Я просто изменил "cin >> n >> m" на "scanf ("% d% d ", & n, & m)" и несколько крошечных "couts"

16
ответ дан 24 November 2019 в 02:39
поделиться

Конечно, смешно использовать cstdio вместо iostream. По крайней мере, когда вы разрабатываете программное обеспечение (если вы уже используете c ++ вместо c, то пройдите весь путь и используйте его преимущества вместо того, чтобы страдать от его недостатков).

Но по мнению онлайн-судьи, вы не разрабатываете программное обеспечение, вы создаете программу, которая должна уметь делать то, что программное обеспечение Microsoft выполняет за 60 секунд за 3 секунды !!!

Итак, в этом случае золотое правило выглядит примерно так (конечно, если у вас не возникнет еще больше проблем с использованием java)

  • Используйте c ++ и используйте всю его мощность (и тяжесть / медленность) для решения проблемы
  • Если у вас ограничено время, измените cins и couts для printfs и scanfs (если вы ошиблись, используя строку класса, напечатайте вот так: printf (% s, mystr.c_str ()) );
  • Если у вас все еще ограничено время, попробуйте внести очевидные оптимизации (например, избегайте слишком большого количества встроенных функций для / while / dowhiles или рекурсивных функций). Также убедитесь, что вы передаете слишком большие ссылочные объекты ...
  • Если у вас все еще ограничено время, попробуйте изменить std :: vectors и наборы для c-массивов.
  • Если вы все еще ограничены во времени, переходите к следующей задаче ...
-1
ответ дан 24 November 2019 в 02:39
поделиться