Ryback
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору dremon Цитата: Да уж, ребята.... Тесты показывают, что реализация функции fprintf на данной платформе с данным компилятором для данной версии библиотеки быстрее, чем с iostreams - т.е. они не показывают ничего | Это кому как, можно запросить общественность ( ) прислать сюда побольше результатов тестов. Ну да ладно, забыли. Цитата: Цитата: The functions by themselves would ensure only atomicity of their own operation, but not atomicity over all the function calls. For this it is necessary to perform the stream locking in the application code | И что здесь непонятно или чему-топротиворечит? Здесь написано, что не гарантируется атомарность такого кода: Код: fprintf(stdout, "%d", 1); fprintf(stdout, "%d", 2); | т.е здесь ты сам должен использовать flockfile(). Вот и все, что следует из твоей цитаты стандарта, почему я и решил не приводить этот отрывок. Цитата: О чем я и говорил в самом начале - хочешь жить спокойно с потоками, используй синхронизацию | Да, только почему-то не понимал, что имеется в виду под потокозащищенностью ввода-вывода. Когда я говорил, что cout<< надо будет окружать мутексами, ты как это - "сьехал" на тему "без комментариев". Цитата: а не полагайся на стандартную библиотеку. | "без комментариев" Цитата: POSIX кстати, если что-то requires, то это не значит, что оно implemented everywhere. К тому же это юниксовый стандарт. | POSIX - это не юниксовый стандарт. К тому же не один, а несколько. Согласен, что он ни одной платформой не поддерживается в полном обьеме, но вот stdio точно уж дописали все. Правда в винде нет *_unlocked(). Цитата: И есть еще такой стандарт - ANSI. | и...? Цитата: А то когда Ryback сказал про 5 вызовов cout и один вызов fprintf, извините... | Давай считать вместе Представим простейшую модель. std::cout << 1 << 2 << 3 <<4 <<5; - 5 вызовов operator<<(). - в каждом по одному вызову записи целого числа Итого 10 вызовов. printf("%s", 1,2,3,4,5); - 1 вызов printf - 5 вызовов записи целого числа ( сравнение строки формата несравнимо быстрее вывода на экран/в файл) Итого 6 вызовов. ( правда смешно? ) Реальный код обеих реализаций, естесвенно сложнее. Но аргументы, что парсинг форматной строки это длительная часть в printf безсмысленны. И хотя прмеров на этот диалог уже было достаточно, напомню, что форматирование вывода в iostreams тоже имеется, хотя imho более громоздкое. И в конце добавлю. Ты когда-нибудь делал бинарный ввод-вывод на iostreams? Именно бинарный, в отличии от текстовой направленности iostreams? Т.е. надо записать u_int32_t в четыре байта, а не его текстовое/человеческое представление. Удобно? Или ты сможешь мне гарантировать, что файл, который ты писал, действительно попал на диск, после того, как вернулся << или flush()? Я думаю известно, что кроме fsync() на файл, необходимо сделать fsync() и на каталог, где он находится. Как это сделать с iostreams? Никак. (flush_with_stdio не поможет). Вот тебе и надежность. И ANSI не поможет, если надо писать crash-proof application. |