Являются ли операторы C++ ‹‹ и ›› медленными? Какие есть альтернативы этим операторам?

Я делаю проект для колледжа и использую C++. Я использовал std::cin и std::cout с операторами << и >> для чтения ввода и отображения вывода. Мой профессор опубликовал объявление о том, что >> и << не рекомендуются, потому что они медленные.

Нам нужно читать только целые числа, и ввод всегда правильный (нам не нужно его проверять, мы знаем формат, в котором он находится, и нам просто нужно его прочитать). Какие альтернативы мы должны использовать тогда, если << и >> не рекомендуются?


person Hel    schedule 18.03.2015    source источник
comment
Попахивает преждевременной оптимизацией, если сообщение профессора здесь точно и полно.   -  person Drew Dormann    schedule 19.03.2015
comment
Возможно, он хочет, чтобы вы использовали функции ввода-вывода в стиле C, такие как printf, scanf и другие.   -  person 0x499602D2    schedule 19.03.2015
comment
@ 0x499602D2: Возможно, но я не знаю причин предполагать, что они быстрее, чем std::cout << ... и std::cin >> .... Обратите внимание, что printf должен анализировать строку формата.   -  person Keith Thompson    schedule 19.03.2015
comment
Профилировал ли профессор операторов, чтобы подтвердить свое заявление о том, что они медленные? И медленно по сравнению с чем именно? Какова его альтернатива?   -  person Remy Lebeau    schedule 19.03.2015
comment
Существует некоторое предварительное обсуждение вопроса об эффективности: stackoverflow.com/questions/605839/c-and -c-file-io Лично от себя: если вы посещаете вводный курс по программированию, вам не стоит беспокоиться об эффективности такого рода.   -  person mattm    schedule 19.03.2015
comment
@RemyLebeau: Обычные жалобы вращаются вокруг того факта, что iostreams использует вызов виртуальной функции для каждого записанного байта, даже для неформатированных операций чтения/записи, и блокировок, связанных с привязкой к потокам C, что является состоянием по умолчанию.   -  person Mooing Duck    schedule 19.03.2015
comment
Насколько мне известно, стандартный совет — избегать смешивания printf и cout в одной программе. Только в этом случае вы будете платить за синхронизацию между типобезопасными потоками ввода-вывода C++ и устаревшим вводом-выводом C.   -  person Erik Alapää    schedule 19.03.2015
comment
@ 0x499602D2, я нахожу это странным, но если нет другой альтернативы, думаю, мне придется это сделать.   -  person Hel    schedule 19.03.2015
comment
@RemyLebeau, вот в чем дело. Он ничего не сказал. Он привел примеры для Java, а для C++ сказал только это.   -  person Hel    schedule 19.03.2015
comment
@mattm, я хожу на урок алгоритмов, так что все дело в эффективности. Вот почему я беспокоюсь.   -  person Hel    schedule 19.03.2015
comment
@Helena: Итак, ваш профессор утверждает, что Java быстрее, чем C ++, без доказательств? Вот это да. Удачи в вашем классе.   -  person Remy Lebeau    schedule 19.03.2015
comment
@RemyLebeau, нет. Этот проект может быть выполнен на одном из трех языков: C, C++ или Java. Я выбрал C++ вместо C только потому, что в нем реализовано много структур данных, которые были бы очень полезны. Есть люди, которые пытались делать на Java, но не могут пройти все тесты, поэтому он опубликовал объявление о том, что в C++ операторы ‹‹ и ›› не рекомендуются, потому что они медленнее, а затем привел несколько примеров для тех, кто использует Java. Он никогда не говорил, что Java быстрее, чем C++, он просто сказал нам, что мы должны использовать в Java для ввода/вывода.   -  person Hel    schedule 19.03.2015
comment
Эффективность вашей программы основана на эффективности алгоритма, а не на реализации таких вещей, как подпрограммы ввода-вывода. Вам должны быть интересны такие концепции, как линейный поиск по сравнению с бинарным поиском. Большая часть вашего кода не будет достаточно большой, чтобы беспокоиться о скорости ввода-вывода.   -  person Thomas Matthews    schedule 19.03.2015
comment
@ThomasMatthews, программа завершена, и все алгоритмы были тщательно выбраны с учетом проблемы. Меня беспокоит ввод-вывод из-за рекомендации моего профессора не использовать ‹‹ и ››, и никакой другой причины.   -  person Hel    schedule 19.03.2015


Ответы (2)


Беспокоиться о скорости операторов извлечения потока (‹‹ и >>) в C++ стоит, когда у вас много данных для обработки (более 1E06 элементов). Для небольших наборов данных время выполнения незначительно по сравнению с другими факторами, связанными с компьютером и вашей программой.

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

Медлительность операторов извлечения потока сначала переводит из текстового представления во внутреннее представление, а затем в реализацию. Черт возьми, если вы вводите данные, забудьте об оптимизации. Чтобы ускорить чтение файла, организуйте данные для удобного извлечения и перевода.

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

Из Автостопом по Галактике НЕ ПАНИКУЙТЕ.

person Thomas Matthews    schedule 18.03.2015
comment
Вместо этого я использовал scanf и printf (что сделало его немного быстрее). Тем не менее, спасибо за идею представления двоичного файла, на нее стоит обратить внимание. - person Hel; 19.03.2015

Для cout вы можете использовать put или написать

// single character
char character;
cout.put(character);

// c string
char * buffer = new char[size];
cout.write(buffer, size);

Для cin вы можете использовать get, read или получить строку

// Single character
char ch;
std::cin.get(ch); 

// c string
char * buffer = new char[size];
std::cin.read(buffer, size);
std::cin.get(buffer, size);
std::cin.getline(buffer, size);
person Craig K    schedule 18.03.2015
comment
Я не думаю, что они значительно быстрее, чем версии <<, и вы не предоставляете способ обработки целых чисел. - person Mooing Duck; 19.03.2015
comment
Большая часть потери эффективности связана с переводом из текстового представления во внутреннее представление. - person Thomas Matthews; 19.03.2015
comment
Спасибо за ответ. Вместо этого я использовал scanf и printf. - person Hel; 19.03.2015