А file.Sync() делает обмен с диском только если буфер заполнен? Или как?
ps И с чего ты взял что оно в обход системного буфера работает?
Я ничего ниоткуда не взял. fsync заставляет систему если что и было в буфере, скинуть из буфера это дело на диск. Если там ничего не было, то конечно ничего скинуто и не будет (но время на syscall конечно все равно будет потрачено).
Соответственно что происходит - кладем байт в системный буфер, затем говорим системе - сбрось все из буфера на диск. Этот байт пишется на диск. Это если без нашего буфера работать.
Если с нашим, то кладем байт в наш буфер, если он наполнился, то скидываем его содержимое в системный буфер, иначе ничего не делаем + в любом случае просим систему сбросить содержимое системного буфера на диск.
Факт, что система, когда её буфер пуст, при вызове fsync не обращается к диску, виден в отношении времен 4 и 2 строчки таблицы. Отношение равно 12,7, что хорошо согласуется (по порядку величины) с теоретическим отношением равным 16.
Понятно что с FILE_FLAG_NO_BUFFERING, но без fsync результаты будут несколько лучше. Но совсем немного. Не на порядок.