Автор Тема: Буферизация ввода/вывода  (Прочитано 27217 раз)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Буферизация ввода/вывода
« Ответ #30 : Январь 17, 2013, 11:41:34 am »
Т.е. для уменьшения частоты обмена с системным буфером логичнее было бы делать пользовательский буфер больше (32КБ - 64КБ), но они этого не сделали, и даже сделали размер неизменным...
Палка о двух концах. Во-первых 64 Кб это уже много. Это ж буфер на один файл. Открой 100 файлов, и получи 6.4 Мб затрат ОЗУ. Это дофига, между прочим. Это  больше чем воткнуто в типичную машину!

Во-вторых большой буфер - это больше вероятность потерять данные в случае падения приложения.
Y = λf.(λx.f (x x)) (λx.f (x x))

Romiras

  • Sr. Member
  • ****
  • Сообщений: 264
    • Просмотр профиля
    • Romiras Dev Lab
Re: Буферизация ввода/вывода
« Ответ #31 : Январь 17, 2013, 11:42:23 am »
Моё предположение таково: размер кеша имеет прямое отношение и к размеру кластера на ФС. Который может быть 1кб и выше - зависит от нужды хранить много мелких файлов, для наиболее эффективного использования дискового пространства. А системный буфер является прослойкой между разнящимися размерами кластера и API чтения с файла. То есть он заведомо больше размера сектора.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Буферизация ввода/вывода
« Ответ #32 : Январь 17, 2013, 11:48:19 am »
Моё предположение таково: размер кеша имеет прямое отношение и к размеру кластера на ФС. Который может быть 1кб и выше - зависит от нужды хранить много мелких файлов, для наиболее эффективного использования дискового пространства. А системный буфер является прослойкой между разнящимися размерами кластера и API чтения с файла. То есть он заведомо больше размера сектора.
Размер кластера может быть 512 байт.
Можно сделать буфер размером в 1234 байта, существенной разницы с 1024 не будет. Скорее всего будет быстрее. Впрочем, это легко проверить.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Буферизация ввода/вывода
« Ответ #33 : Январь 17, 2013, 11:53:59 am »
В ориг. Обероне будет существенная разница (в худшую сторону), а в ББ скорее всего нет (буфер то пользовательский). А при отключенном системном буфере венда вообще не даст так сделать :)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Буферизация ввода/вывода
« Ответ #34 : Январь 17, 2013, 11:54:50 am »
Romiras, а ты не сравнивал случайно FPC и ББ по скорости I/O?

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Буферизация ввода/вывода
« Ответ #35 : Январь 17, 2013, 11:56:49 am »
Т.е. для уменьшения частоты обмена с системным буфером логичнее было бы делать пользовательский буфер больше (32КБ - 64КБ), но они этого не сделали, и даже сделали размер неизменным...
Палка о двух концах. Во-первых 64 Кб это уже много. Это ж буфер на один файл. Открой 100 файлов, и получи 6.4 Мб затрат ОЗУ. Это дофига, между прочим. Это  больше чем воткнуто в типичную машину!

Во-вторых большой буфер - это больше вероятность потерять данные в случае падения приложения.
Ну да, многовато. Но это зависит от задачи. А в ББ свой размер нельзя задать. Что не есть гуд.

Romiras

  • Sr. Member
  • ****
  • Сообщений: 264
    • Просмотр профиля
    • Romiras Dev Lab
Re: Буферизация ввода/вывода
« Ответ #36 : Январь 17, 2013, 12:01:45 pm »
Romiras, а ты не сравнивал случайно FPC и ББ по скорости I/O?
Нет. А на примере чего?

Romiras

  • Sr. Member
  • ****
  • Сообщений: 264
    • Просмотр профиля
    • Romiras Dev Lab
Re: Буферизация ввода/вывода
« Ответ #37 : Январь 17, 2013, 12:05:25 pm »
Размер кластера может быть 512 байт.
Были и такие времена. Но уже, как правило, не меньше 4096 по умолчанию. Впрочем, это зависит от того какого размера данные будут на этой ФС и задаётся при форматировании раздела.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Буферизация ввода/вывода
« Ответ #38 : Январь 17, 2013, 12:06:50 pm »
Моё предположение таково: размер кеша имеет прямое отношение и к размеру кластера на ФС. Который может быть 1кб и выше - зависит от нужды хранить много мелких файлов, для наиболее эффективного использования дискового пространства. А системный буфер является прослойкой между разнящимися размерами кластера и API чтения с файла. То есть он заведомо больше размера сектора.
Размер кластера может быть 512 байт.
Можно сделать буфер размером в 1234 байта, существенной разницы с 1024 не будет. Скорее всего будет быстрее. Впрочем, это легко проверить.

Все. Проверил. Результаты ровно те, которые я ранее предсказывал:
Код:
package main

import "fmt"
import "os"
import "bufio"

func main() {
file, err := os.Create("hello2.txt")
if err!= nil {
fmt.Print(err)
return
}
w := bufio.NewWriterSize(file,1234)
for i:=0; i<100000000; i++ {
fmt.Fprintf(w, "a")
}
}

Собственно тут 1234 -- это та самая циферька которую будем менять.

Провел эксперимент с размером буфера в 1024, 16, и 1234 байта.

Результаты:
1024:
Цитировать
ETime(   0:00:22.840 ) UTime(   0:00:22.448 ) KTime(   0:00:00.358 )
ITime(   0:00:00.000 )

16:
Цитировать
ETime(   0:00:39.146 ) UTime(   0:00:28.704 ) KTime(   0:00:10.405 )
ITime(   0:00:00.000 )

1234:
Цитировать
ETime(   0:00:22.647 ) UTime(   0:00:22.323 ) KTime(   0:00:00.265 )
ITime(   0:00:00.000 )

Ну и, до кучи, попробую сейчас 4096 сделать. Думаю что особой разницы с 1234 и 1024 не будет.
Y = λf.(λx.f (x x)) (λx.f (x x))

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Буферизация ввода/вывода
« Ответ #39 : Январь 17, 2013, 12:10:05 pm »
1234:
Цитировать
ETime(   0:00:22.647 ) UTime(   0:00:22.323 ) KTime(   0:00:00.265 )
ITime(   0:00:00.000 )

Ну и, до кучи, попробую сейчас 4096 сделать. Думаю что особой разницы с 1234 и 1024 не будет.

Ну, собственно вот:
Цитировать
ETime(   0:00:22.081 ) UTime(   0:00:21.855 ) KTime(   0:00:00.202 )
ITime(   0:00:00.000 )

А если не видно разницы, зачем платить больше? :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Буферизация ввода/вывода
« Ответ #40 : Январь 17, 2013, 12:12:45 pm »
Romiras, а ты не сравнивал случайно FPC и ББ по скорости I/O?
Нет. А на примере чего?
Ну вот к примеру как valexey выше проверил на Гоше

Romiras

  • Sr. Member
  • ****
  • Сообщений: 264
    • Просмотр профиля
    • Romiras Dev Lab
Re: Буферизация ввода/вывода
« Ответ #41 : Январь 17, 2013, 12:13:06 pm »
valexey, твой аппликативный буфер не имеет прямого отношения к буферу API, который обращается напрямую к файловой системе. Следовательно, разницы в результатах быть и не должно.

Romiras

  • Sr. Member
  • ****
  • Сообщений: 264
    • Просмотр профиля
    • Romiras Dev Lab
Re: Буферизация ввода/вывода
« Ответ #42 : Январь 17, 2013, 12:15:32 pm »
Romiras, а ты не сравнивал случайно FPC и ББ по скорости I/O?
Нет. А на примере чего?
Ну вот к примеру как valexey выше проверил на Гоше
Не должно зависеть от выбранного ЯП. Только от реализации системных вызовов.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Буферизация ввода/вывода
« Ответ #43 : Январь 17, 2013, 12:15:48 pm »
valexey, твой аппликативный буфер не имеет прямого отношения к буферу API, который обращается напрямую к файловой системе. Следовательно, разницы в результатах быть и не должно.
Напрямую к FS обращается вообще то драйвер. То есть это ровно то, что не имеет отношения к тому что в ББ проставлено.

Изначально мы говорили о буфере который сидит на стороне приложения а не ОСи. Советую внимательно перечитать дискуссию.
Y = λf.(λx.f (x x)) (λx.f (x x))

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems
Re: Буферизация ввода/вывода
« Ответ #44 : Январь 17, 2013, 12:16:50 pm »
А если не видно разницы, зачем платить больше? :-)

Я на BB тоже вчера проверял (только на чтение 1,8ГБ)  :)
2 - 28876 миллисек
4 - 27846 миллисек
8 -  27815 миллисек