А программный буфер - это штука чисто виртуальная. Она должна влиять лишь на объём потребляемой памяти программой.
Таковы мои соображения.
Оставленное в цитате - не правильные соображение. Програмный буфер значительно влияет на производительность за счет снижения числа системных вызовов - системный вызов это большие тормоза.
Исправляюсь. Теперь эксперимент более чистый. Причем на чтение.
Буфер у меня, как понимаете, програмный. На стороне приложения. К системе отношения не имеющий.
Исходник такой:
package main
import "fmt"
import "os"
import "bufio"
func main() {
file, err := os.Open("1000000000.txt")
if err!= nil {
fmt.Print(err)
return
}
r := bufio.NewReaderSize(file,16)
for i:=0; i<1000000000; i++ {
r.ReadByte()
}
}
Вариация для чтения без буфера:
func main() {
file, err := os.Open("1000000000.txt")
if err!= nil {
fmt.Print(err)
return
}
var buf []byte = make([]byte, 1)
for i:=0; i<1000000000; i++ {
file.Read(buf)
}
}
Результаты:
64*1024:
ETime( 0:00:07.977 ) UTime( 0:00:07.456 ) KTime( 0:00:00.499 )
ITime( 0:00:00.000 )
4096:
ETime( 0:00:08.935 ) UTime( 0:00:07.347 ) KTime( 0:00:01.591 )
ITime( 0:00:00.000 )
1234:
ETime( 0:00:11.981 ) UTime( 0:00:08.892 ) KTime( 0:00:03.010 )
ITime( 0:00:00.000 )
1031 (простое число):
ETime( 0:00:12.444 ) UTime( 0:00:08.034 ) KTime( 0:00:04.414 )
ITime( 0:00:00.000 )
Но тут все сложно на самом деле - время скачет при этом размере буфера довольно сильно - бывает что подскакивает аж до 17ти секунд.
1024:
ETime( 0:00:12.423 ) UTime( 0:00:08.236 ) KTime( 0:00:04.180 )
ITime( 0:00:00.000 )
А вот тут - стабильно. Похоже, прыжки - особенность простых чисел. Но это конечно требует дополнительного исследования.
1000 (кратно размеру файла (в байтах)):
ETime( 0:00:12.719 ) UTime( 0:00:08.860 ) KTime( 0:00:03.837 )
ITime( 0:00:00.000 )
907 (простое число)
ETime( 0:00:13.378 ) UTime( 0:00:09.172 ) KTime( 0:00:04.056 )
ITime( 0:00:00.000 )
Прыжков нет. Все стабильно. Ничего не понимаю.
400 байт:
ETime( 0:00:19.790 ) UTime( 0:00:10.264 ) KTime( 0:00:09.500 )
ITime( 0:00:00.000 )
16:
ETime( 0:05:27.683 ) UTime( 0:01:21.962 ) KTime( 0:03:52.878 )
ITime( 0:00:00.000 )
Без буфера (буфера приложения, системный кеш я не отключал, а отключить кеш самого hdd не представляется возможным) вообще. Поскольку я не смог дождаться на гигабайтном файле (точнее на 1000000000 байтном), я уменьшил размер в 100 раз:
ETime( 0:00:48.116 ) UTime( 0:00:10.561 ) KTime( 0:00:37.549 )
ITime( 0:00:00.000 )
Соответственно и времена нужно умножить на 100.
Итого сводная табличка:
Буфер Full T System T
65536 7.977 0,499
4096 8.935 1,591
1234 11.981 3.01
1031 12.444 4.414
1024 12.423 4.18
1000 12.719 3.837
907 13.378 4.056
400 19.939 9.874
16 327.683 232.878
0 48116.0 37549.0
Итак, програмный буфер (буфер который ничего не знает о ФС, который у нас в программе и про который ни ФС ни драйвер диска ни система ничего не знает) существенно влияет на производительность. Минимальный разумный размер такого буфера - порядка 1000 байт. И само это число не обязано быть степенью двойки. Единственное - следует избегать простых чисел.
Что-то осталось не ясным? :-)