Std::ios_base::sync_with_stdio [обращение к опытным]
Читал статью о том на сколько медленный iostream и там упоминалось о std::ios_base::sync_with_stdio позволяющей смешивать iostream & stdio, от которой якобы буфер сбрасывает данные после ввода/вывода, чтобы данные не перемешивались. Зашел подробнее почитать на cppreferense и там приведен следующий пример кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include #include int main() { std::ios::sync_with_stdio(false); std::cout "a\n"; std::printf("b\n"); std::cout "c\n"; /* output: b a c */ }
Почему изначально выводится prinft, а после cout?
Это связано с тем, что когда мы офнули синхру,то prinft работает быстрее cout?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
В чём разница между std::ios::app и std::ios_base::app
В чём разница между std::ios::app и std::ios_base::app? На практике разницы не вижу, но вопросом.
Ошибка при повторном запуске: terminate called after throwing an instance of ‘std::ios_base::failure’
Здравствуйте, вот этот кусок кода(дан ниже) при повторном запуске программы выдает ошибку.
Не работает корректно ios_base::trunc | ios_base::out
Вкратце суть проблемы в том, что запись(ниже) не удаляет содержимое файла, а записывает данные в.
Обращение к полю элемента std::vector’a
Здравстуйте! 🙂 Несильно знаком с STL пока, возникла проблемка. Есть класс: class DataBase
3434 / 2813 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
Сообщение от anapshy
Почему изначально выводится prinft, а после cout?
У меня, что с sync, что без: очерёдность вывода — как в коде.
Добавлено через 2 минуты
Сообщение от anapshy
и там упоминалось о std::ios_base::sync_with_stdio
А там не упоминалось, что это помогает (для ускорения С++ потоков) не всегда (зависит от платформы и пр.)? У меня, например — без разницы.
239 / 265 / 218
Регистрация: 14.11.2016
Сообщений: 1,035
nd2, на cpp.sh вообще выводит a c b
1 2 3 4 5 6 7 8 9 10
#include #include int main(void) { std::ios::sync_with_stdio(false); std::cout "a\n"; std::printf("b\n"); std::cout "c\n"; return 1; }
7597 / 6420 / 2924
Регистрация: 14.04.2014
Сообщений: 27,963
Этот sync как раз и обеспечивает ту последовательность, которая в программе.
239 / 265 / 218
Регистрация: 14.11.2016
Сообщений: 1,035
nmcf, ну это я понимаю, но когда его отключаем, то ХАОС
850 / 438 / 89
Регистрация: 10.06.2014
Сообщений: 2,611
nd2,
А какой у вас компилятор?
Вы проставили false до всех операций ввода/вывода?
7597 / 6420 / 2924
Регистрация: 14.04.2014
Сообщений: 27,963
Сообщение от anapshy
но когда его отключаем, то ХАОС
Ну так не отключай или пользуйся чем-то одним. В чём проблема-то?
850 / 438 / 89
Регистрация: 10.06.2014
Сообщений: 2,611
anapshy,
Хаос потому, что плюсовый вывод не сразу отправляет в выходной поток свои данные а сохраняет их в буфер до тех пор, пока не будет вызван манипулятор std::flush для сброса буфера. Это позволяет ускорить программу, так как если бы данные сразу отправлялись в стандартный поток вывода, то на каждый вызов std::cout приводил бы к системному вызову, а это затратная операция. В прочем плюсовые потоки сами по себе медленные, но данная буферизация позволяет их ускорить. А сишные функции для управления выводом в отличии от плюсовых сразу отправляют данные в стандартный поток вывода при этом делая системный вызов при каждой такой операции. Поэтому и нарушается последовательность вывода.
std:: ios_base
The class ios_base is a multipurpose class that serves as the base class for all I/O stream classes. It maintains several kinds of data:
1) state information: stream status flags.
2) control information: flags that control formatting of both input and output sequences and the imbued locale.
3) private storage: indexed extensible data structure that allows both long and void * members, which may be implemented as two arbitrary-length arrays or a single array of two-element structs or another container.
4) callbacks: arbitrary number of user-defined functions to be called from imbue(), std::basic_ios::copyfmt() , and ~ios_base().
Typical implementation holds member constants corresponding to all values of fmtflags, iostate, openmode, and seekdir shown below, member variables to maintain current precision, width, and formatting flags, the exception mask, the buffer error state, a resizeable container holding the callbacks, the currently imbued locale, the private storage, and a static integer variable for xalloc().
Contents
- 1 Member functions
- 1.1 Formatting
- 1.2 Locales
- 1.3 Internal extensible array
- 1.4 Miscellaneous
- 3.1 Deprecated member types
В чём разница между std::ios::app и std::ios_base::app
Разница между ios::ate и ios::app
Здравствуйте, кто нить может поконкретнее и человеческим языком объяснить в чем разница между.В чем отличия между std::cref() и std::bind()?
В документации не понял, что делает bind() ? И чем отличается cref() от операции взятия адреса? .Почему std::string_view МЕДЛЕННЕЕ, чем std::string?
Всем привет! Нужно найти количество уникальных строк в больших текстовых файлах (размером до.Std::ios_base::sync_with_stdio [обращение к опытным]
Читал статью о том на сколько медленный iostream и там упоминалось о std::ios_base::sync_with_stdio.Ios base c что это
127.0.0.1 → Codeforces Round 907 (Div. 2) Editorial
zhengcong → Appeal for Re-evaluation of Similarity in Code Style
127.0.0.1 → Codeforces Round 907 (Div. 2)
-shadow- → помогите решить геометрическую задачу
elshiko → Квалификационный раунд Yandex Cup 2023
purp4ever → Teams Qualified for Africa and Arab Collegiate Programming Championship — ACPC 2023 (+teens)
ICPCNews → ICPC 2023 Online Challenge powered by Huawei
JelalTkm → tourist’s Birthday!
iordache_ → Isaac Herzog
noomaK → IEEEXtreme 17.0 Problems Discussion
AquaMoon → Harbour.Space Scholarship Contest 2023-2024 (Div. 1 + Div. 2) Editorial
plourde27 → California Informatics Competition (CALICO) Fall ’23
vkgainz → California Informatics Competition (CALICO) Fall ’23
orz → Codeforces Round 907 (Div. 2) Screencast & Editorial
E869120 → To resubmit or Not to resubmit
Imakf → Codeforces Round 906 Editorial
tminh_hk20 → I need helps about a segment tree dp problem with queries.
jli505 → IOI Gold Medalist Speaker Event
Koyote → Please help me with a string search problem
k o_osaga → A Brief Inquiry into Online Connectivity
74TrAkToR → Codeforces Round #905 (Div. 1, Div. 2, Div. 3) Editorial
Yandex → Yandex Cup 2023
naisheelpatel → Invitation to FIZZBUZZ 2023 — Starters 106 (Rated up to 5 Stars) — 1st November
Vladosiya → Codeforces Round 903 (Div. 3) Разбор
guesshere → Expected value problem E atcoder beginner contest 326
Блог пользователя MikeMirzayanov
Автор MikeMirzayanov, 14 лет назад ,
Если вы пишите на С++, то регулярно бывает так, что ввод написанный через std::cin начинает тормозить из-за громоздких входных данных. Конечно правильнее в таких случаях сразу же писать чтение данных более эффективно — хотя бы с помощью функции scanf. Но если тестирующая система использует GNU C++ (проверял на MinGW 4.4.1, но думаю и на других версиях тоже будет работать), а переписывать программу не хочется, то можно катастрофически ускорить чтение всего одной строкой, размещенной в начале программы: ios_base::sync_with_stdio( 0 ) .
На моем примере, где надо было найти сумму миллиона целых чисел, это ускорило программу в 4.5 раза, приблизив время работы к варианту со scanf. Пробовал запускать этот же тест на MS Visual C++ 9.0 — но не ускоряет.
ios_base, с++, чтение данных
Комментарии (34)
Показать архивные | Написать комментарий?
14 лет назад , # |
Затестил, риально работает!
также виден прирост скорости операций I/O на GNU C++3.4.2
14 лет назад , # |
наверное общеизвестный факт:Если вы пишите на Java , то регулярно бывает так, что ввод написанный через Scanner начинает тормозить из-за громоздких входных данных.
По старой привычке я автоматически набираю Scanner in = new Scanner (System.in); int n = in.nextInt(); Но по опыту уже знаю, что намного лучше обрабатывает входные данные StreamTokenizer, но строчка:
in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
int nextInt() throws IOException
выглядит немного пугающе.
14 лет назад , # ^ |Я тоже пишу на Java. Как раз для таких случаев у меня припасён переписанный Сканер (Извините, если отступы сбились) class Scanner<
<>
Scanner(InputStream stream) in = new StreamTokenizer(new InputStreamReader(stream));
>void asserT(boolean e) if (!e) throw new Error();
>
>int nextInt() try in.nextToken();
asserT(in.ttype == in.TT_NUMBER);
asserT(in.nval == (int)in.nval);
return (int) in.nval;
>catch (Exception e) throw new Error();
>
>
>
Ну и метод запуска программы void run() in = new Scanner(System.in);
out = new PrintWriter(System.out);
try solve();
>finally out.close();
>
>
Никаких посторонних «шаманств» не надо. Ассерты установлены, чтобы программа не дай бог не получила WA или ещё что-нить при некорректном вводе вместо Crash.12 лет назад , # ^ |
Я один вместо «Assert» прочитал «Accept»? =)
12 лет назад , # |
Может есть способ сделать ускорение потокового ввод-вывода в Visual Studio?
12 лет назад , # |
У меня не получилось можете пожалуйста написать простой пример кода?
12 лет назад , # ^ |← Rev. 2 → 0
Во-первых: Пробовал запускать этот же тест на MS Visual C++ 9.0 — но не ускоряет.
а вообще так по идее
using namespace std;
ios_base::sync_with_stdio( 0);
12 лет назад , # |
tooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooold
10 лет назад , # ^ |
some one doesn’t say anything twice unless he has a good reason for it 😉12 лет назад , # |
Сейчас при решении кодчифа ( http://www.codechef.com/MARCH12/problems/HDELIVER ) столкнулся с одной проблемой.. раньше не встречал.. Кто-нибудь в курсе почему происходит такая вещь?
Значится так: я всегда пишу код в своём шаблоне, где у меня есть также строка ios::sync_with_stdio(0); в самом начале main(). Я обычно считываю cin/cout и программа не захотела заходить по ТЛ. ну естественно в первую очередь написал scanf(), но как бы зачем это делать в тех местах, которые отработают раз 100. так что исправил только там, где много данных считывается. Засылаю, получаю рантайм (ошибка доступа). Вобщем выяснил, что что-то не так считывается. Задача зашла только когда либо закомментил ios::sync_with_stdio(0); либо когда все cin исправил на scanf(). То есть проблема именно в том, что не может быть написано одновременно ios::sync_with_stdio(0); и чередование в середине программы cin и scanf(). Причём мне почему-то кажется, что раньше я так делал и никаких проблем связанных с этим не возникало.