Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
|
|||
|---|---|---|---|
|
#18+
Написал программку, которая в 4 потока (по количеству ядер CPU) пишет небольшие бинарные файлы. У каждого потока свои файлы, так что пересечений нет. В каждом потоке CPU использую один поток вывода std::ofstream. Беда заключается в том, что основное время работы программы- функция записи на диск, которая делится: Код: plaintext 1. 2. С чем связано подобное распределение времени? Как ускорить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2018, 16:45 |
|
||
|
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLНаписал программку, которая в 4 потока (по количеству ядер CPU) пишет небольшие бинарные файлы. У каждого потока свои файлы, так что пересечений нет. В каждом потоке CPU использую один поток вывода std::ofstream. Беда заключается в том, что основное время работы программы- функция записи на диск, которая делится: Код: plaintext 1. 2. С чем связано подобное распределение времени? Как ускорить? close() делает flush(), так что отдельный вызов flush() бессмысленен, если не нужно именно в этот момент физически записать данные в файл. Конкретное распределение времён, думаю, случайно. Ты вообще как мерил? У тебя 24+31+9 = 64% . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2018, 16:58 |
|
||
|
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL Как ускорить? Никак. Если запись на диск делается много раз, лучше один раз открыть файл, потом писать много раз, потом закрыть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2018, 17:00 |
|
||
|
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
|
|||
|---|---|---|---|
|
#18+
MasterZivclose() делает flush(), так что отдельный вызов flush() бессмысленен, если не нужно именно в этот момент физически записать данные в файл. Конкретное распределение времён, думаю, случайно. Ты вообще как мерил? У тебя 24+31+9 = 64% . Я мерил с помощью Intel Vtune Amplifier. Процедура записи на диск занимает 67% времени от всей программы (кроме открытия, сброса данных и записи в файл есть еще мелочевка, которая и занимает 3%). За подсказку по ненужности flush() отдельное спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2018, 17:06 |
|
||
|
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL... пишет небольшие бинарные файлы.... Если файл 1 байт, а название файла 10 байт то совершенно очевидно, что open и close должны работать минимум в 10 раз медленнее, чем flush :) p.s. В конце предложения смайлик. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2018, 17:07 |
|
||
|
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLС чем связано подобное распределение времени? Файловая систем, небось, журналируемая и atime не отключен... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2018, 17:15 |
|
||
|
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
|
|||
|---|---|---|---|
|
#18+
MasterZivAlekseySQL Как ускорить? Никак. Если запись на диск делается много раз, лучше один раз открыть файл, потом писать много раз, потом закрыть. А, ещё можно писать/читать как можно бОльшими блоками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2018, 17:15 |
|
||
|
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovФайловая систем, небось, журналируемая и atime не отключен... Да, использую журналируемую ext4, а что такое atime? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2018, 17:18 |
|
||
|
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLMasterZivclose() делает flush(), так что отдельный вызов flush() бессмысленен, если не нужно именно в этот момент физически записать данные в файл. Конкретное распределение времён, думаю, случайно. Ты вообще как мерил? У тебя 24+31+9 = 64% . Я мерил с помощью Intel Vtune Amplifier. Процедура записи на диск занимает 67% времени от всей программы (кроме открытия, сброса данных и записи в файл есть еще мелочевка, которая и занимает 3%). За подсказку по ненужности flush() отдельное спасибо! Вообще говоря, так и должно быть. Если программа что-то считает а потом записывает, то как правило 80-90% её работы по времени - именно запись в файл (или чтение из файла) . Потому что любой IO -- это милисекунды, а работа в процессоре -- наносекунды. Разница в 5-6 порядков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2018, 17:18 |
|
||
|
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovФайловая систем, небось, журналируемая и atime не отключен... Спасибо, в fstab у ФС поставил настройки: noatime,nodiratime и теперь (с учетом того, что нет лишнего flash()) время записи упало до 41,7%: Код: plaintext 1. По логике при выкидывании flash() все проценты должны были подрасти примерно на 1/10 (flash занимал 9%), а как мы видим время открытия и закрытия файла с настройками noatime,nodiratime сократилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2018, 17:52 |
|
||
|
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
|
|||
|---|---|---|---|
|
#18+
У меня подозрение, что закрытие файла происходит синхронно, т.е. программа не идет дальше, пока файл не закроется. У меня же каждый файл пишется только 1 раз и можно не ждать завершения записи, а заняться выполнением дальше. Как закрыть файл асинхронно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2018, 18:02 |
|
||
|
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLУ меня подозрение, что закрытие файла происходит синхронно, т.е. программа не идет дальше, пока файл не закроется. У меня же каждый файл пишется только 1 раз и можно не ждать завершения записи, а заняться выполнением дальше. Как закрыть файл асинхронно? Вопрос снимается! p.s. Я лохушка: у меня в файл писалось для каждой строчки массива, а не целым массивом :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2018, 18:30 |
|
||
|
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLУ меня подозрение, что закрытие файла происходит синхронно, т.е. программа не идет дальше, пока файл не закроется. Безусловно, это так. И я тебе скажу даже больше: это характерно для большинства других функций и даже для просто операций в программе. Они выполняются строго синхронно. А именно -- программа не идёт дальше, пока операция не выполнится. На этом странном свойстве построено одно из главных свойств программ -- детерминированность выполнения её операций и ветвей. AlekseySQLУ меня же каждый файл пишется только 1 раз и можно не ждать завершения записи, а заняться выполнением дальше. Как закрыть файл асинхронно? Невозможно. Но ты конечно можешь создать отдельный поток для закрытия файла. Или даже больше -- пул фоновых потоков для закрытия пула файлов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.03.2018, 18:49 |
|
||
|
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
|
|||
|---|---|---|---|
|
#18+
MasterZivAlekseySQLУ меня подозрение, что закрытие файла происходит синхронно, т.е. программа не идет дальше, пока файл не закроется. Безусловно, это так. И я тебе скажу даже больше: это характерно для большинства других функций и даже для просто операций в программе. Они выполняются строго синхронно. А именно -- программа не идёт дальше, пока операция не выполнится. На этом странном свойстве построено одно из главных свойств программ -- детерминированность выполнения её операций и ветвей. Не соглашусь: та же запись в файлы идет асинхронно через буферы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2018, 09:04 |
|
||
|
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLMasterZivпропущено... Безусловно, это так. И я тебе скажу даже больше: это характерно для большинства других функций и даже для просто операций в программе. Они выполняются строго синхронно. А именно -- программа не идёт дальше, пока операция не выполнится. На этом странном свойстве построено одно из главных свойств программ -- детерминированность выполнения её операций и ветвей. Не соглашусь: та же запись в файлы идет асинхронно через буферы. Нет, ты неправ, всё строго синхронно. Вероятно, ты не понимаешь понятие "асинхронно". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2018, 12:20 |
|
||
|
Почему открытие/закрытие файла на запись работают дольше, чем flash()?
|
|||
|---|---|---|---|
|
#18+
MasterZivНет, ты неправ, всё строго синхронно. Вероятно, ты не понимаешь понятие "асинхронно". Насколько я понимаю при записи в файл нужные данные просто сбрасываются в буфер и программа идет дальше. А из буфера по мере возможности все это записывается на диск. Другими словами, после выполнения метода write() на диске все еще находятся старые данные (хотя если читать этот файл в самой программе, то она увидит свой несброшенный буфер и вернет значение оттуда). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2018, 16:36 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39623197&tid=2017903]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
| others: | 299ms |
| total: | 415ms |

| 0 / 0 |
