powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему открытие/закрытие файла на запись работают дольше, чем flash()?
16 сообщений из 16, страница 1 из 1
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
    #39622185
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Написал программку, которая в 4 потока (по количеству ядер CPU) пишет небольшие бинарные файлы. У каждого потока свои файлы, так что пересечений нет. В каждом потоке CPU использую один поток вывода std::ofstream. Беда заключается в том, что основное время работы программы- функция записи на диск, которая делится:
Код: plaintext
1.
2.
Открытие файла (open) - 31%
Сброс инфы в файл (flash) - 9%
Закрытие файла (close)- 24%

С чем связано подобное распределение времени? Как ускорить?
...
Рейтинг: 0 / 0
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
    #39622203
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLНаписал программку, которая в 4 потока (по количеству ядер CPU) пишет небольшие бинарные файлы. У каждого потока свои файлы, так что пересечений нет. В каждом потоке CPU использую один поток вывода std::ofstream. Беда заключается в том, что основное время работы программы- функция записи на диск, которая делится:
Код: plaintext
1.
2.
Открытие файла (open) - 31%
Сброс инфы в файл (flash) - 9%
Закрытие файла (close)- 24%

С чем связано подобное распределение времени? Как ускорить?

close() делает flush(), так что отдельный вызов flush() бессмысленен, если не нужно именно в этот момент физически записать данные в файл.

Конкретное распределение времён, думаю, случайно.
Ты вообще как мерил? У тебя 24+31+9 = 64% .
...
Рейтинг: 0 / 0
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
    #39622207
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL Как ускорить?

Никак.
Если запись на диск делается много раз, лучше один раз открыть файл, потом писать много раз, потом закрыть.
...
Рейтинг: 0 / 0
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
    #39622209
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivclose() делает flush(), так что отдельный вызов flush() бессмысленен, если не нужно именно в этот момент физически записать данные в файл.

Конкретное распределение времён, думаю, случайно.
Ты вообще как мерил? У тебя 24+31+9 = 64% .

Я мерил с помощью Intel Vtune Amplifier. Процедура записи на диск занимает 67% времени от всей программы (кроме открытия, сброса данных и записи в файл есть еще мелочевка, которая и занимает 3%).

За подсказку по ненужности flush() отдельное спасибо!
...
Рейтинг: 0 / 0
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
    #39622210
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL... пишет небольшие бинарные файлы....

Если файл 1 байт, а название файла 10 байт то совершенно очевидно, что open и close должны работать минимум в 10 раз медленнее, чем flush :)

p.s. В конце предложения смайлик.
...
Рейтинг: 0 / 0
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
    #39622218
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLС чем связано подобное распределение времени?

Файловая систем, небось, журналируемая и atime не отключен...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
    #39622219
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivAlekseySQL Как ускорить?

Никак.
Если запись на диск делается много раз, лучше один раз открыть файл, потом писать много раз, потом закрыть.

А, ещё можно писать/читать как можно бОльшими блоками.
...
Рейтинг: 0 / 0
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
    #39622222
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovФайловая систем, небось, журналируемая и atime не отключен...


Да, использую журналируемую ext4, а что такое atime?
...
Рейтинг: 0 / 0
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
    #39622223
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLMasterZivclose() делает flush(), так что отдельный вызов flush() бессмысленен, если не нужно именно в этот момент физически записать данные в файл.

Конкретное распределение времён, думаю, случайно.
Ты вообще как мерил? У тебя 24+31+9 = 64% .

Я мерил с помощью Intel Vtune Amplifier. Процедура записи на диск занимает 67% времени от всей программы (кроме открытия, сброса данных и записи в файл есть еще мелочевка, которая и занимает 3%).

За подсказку по ненужности flush() отдельное спасибо!

Вообще говоря, так и должно быть. Если программа что-то считает а потом записывает, то
как правило 80-90% её работы по времени - именно запись в файл (или чтение из файла) .
Потому что любой IO -- это милисекунды, а работа в процессоре -- наносекунды.
Разница в 5-6 порядков.
...
Рейтинг: 0 / 0
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
    #39622245
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovФайловая систем, небось, журналируемая и atime не отключен...


Спасибо, в fstab у ФС поставил настройки: noatime,nodiratime и теперь (с учетом того, что нет лишнего flash()) время записи упало до 41,7%:
Код: plaintext
1.
Open - 20,7%
Close - 21,6%

По логике при выкидывании flash() все проценты должны были подрасти примерно на 1/10 (flash занимал 9%), а как мы видим время открытия и закрытия файла с настройками noatime,nodiratime сократилось.
...
Рейтинг: 0 / 0
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
    #39622251
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня подозрение, что закрытие файла происходит синхронно, т.е. программа не идет дальше, пока файл не закроется. У меня же каждый файл пишется только 1 раз и можно не ждать завершения записи, а заняться выполнением дальше.

Как закрыть файл асинхронно?
...
Рейтинг: 0 / 0
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
    #39622269
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlekseySQLУ меня подозрение, что закрытие файла происходит синхронно, т.е. программа не идет дальше, пока файл не закроется. У меня же каждый файл пишется только 1 раз и можно не ждать завершения записи, а заняться выполнением дальше.

Как закрыть файл асинхронно?

Вопрос снимается!

p.s. Я лохушка: у меня в файл писалось для каждой строчки массива, а не целым массивом :)
...
Рейтинг: 0 / 0
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
    #39622283
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLУ меня подозрение, что закрытие файла происходит синхронно, т.е. программа не идет дальше, пока файл не закроется.


Безусловно, это так.
И я тебе скажу даже больше: это характерно для большинства других функций и даже
для просто операций в программе.
Они выполняются строго синхронно.
А именно -- программа не идёт дальше, пока операция не выполнится.

На этом странном свойстве построено одно из главных свойств программ -- детерминированность выполнения её операций и ветвей.

AlekseySQLУ меня же каждый файл пишется только 1 раз и можно не ждать завершения записи, а заняться выполнением дальше.
Как закрыть файл асинхронно?

Невозможно.
Но ты конечно можешь создать отдельный поток для закрытия файла.
Или даже больше -- пул фоновых потоков для закрытия пула файлов.
...
Рейтинг: 0 / 0
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
    #39623008
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivAlekseySQLУ меня подозрение, что закрытие файла происходит синхронно, т.е. программа не идет дальше, пока файл не закроется.


Безусловно, это так.
И я тебе скажу даже больше: это характерно для большинства других функций и даже
для просто операций в программе.
Они выполняются строго синхронно.
А именно -- программа не идёт дальше, пока операция не выполнится.

На этом странном свойстве построено одно из главных свойств программ -- детерминированность выполнения её операций и ветвей.

Не соглашусь: та же запись в файлы идет асинхронно через буферы.
...
Рейтинг: 0 / 0
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
    #39623197
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLMasterZivпропущено...


Безусловно, это так.
И я тебе скажу даже больше: это характерно для большинства других функций и даже
для просто операций в программе.
Они выполняются строго синхронно.
А именно -- программа не идёт дальше, пока операция не выполнится.

На этом странном свойстве построено одно из главных свойств программ -- детерминированность выполнения её операций и ветвей.

Не соглашусь: та же запись в файлы идет асинхронно через буферы.

Нет, ты неправ, всё строго синхронно.
Вероятно, ты не понимаешь понятие "асинхронно".
...
Рейтинг: 0 / 0
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
    #39623449
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZivНет, ты неправ, всё строго синхронно.
Вероятно, ты не понимаешь понятие "асинхронно".

Насколько я понимаю при записи в файл нужные данные просто сбрасываются в буфер и программа идет дальше. А из буфера по мере возможности все это записывается на диск. Другими словами, после выполнения метода write() на диске все еще находятся старые данные (хотя если читать этот файл в самой программе, то она увидит свой несброшенный буфер и вернет значение оттуда).
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Почему открытие/закрытие файла на запись работают дольше, чем flash()?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]