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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

Вообще говоря, так и должно быть. Если программа что-то считает а потом записывает, то
как правило 80-90% её работы по времени - именно запись в файл (или чтение из файла) .
Потому что любой IO -- это милисекунды, а работа в процессоре -- наносекунды.
Разница в 5-6 порядков.
...
Рейтинг: 0 / 0
28.03.2018, 17:52
    #39622245
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
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
28.03.2018, 18:02
    #39622251
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
У меня подозрение, что закрытие файла происходит синхронно, т.е. программа не идет дальше, пока файл не закроется. У меня же каждый файл пишется только 1 раз и можно не ждать завершения записи, а заняться выполнением дальше.

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

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

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

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


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

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

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

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


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

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

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


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

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

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

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

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


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