metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2007-12-24 11:27 pm

Файловый кэш

Насколько я помню, винда кэширует обращения к диску. В таком случае вопрос: почему сделать еще один кэш, загрузку в него из файла блоками, кратными размеру кластера и читать мелкие объекты из него получается быстрее чем читать их же напрямую?

[identity profile] 1ceheart.livejournal.com 2007-12-24 11:10 pm (UTC)(link)
Ну, проц точно так же закэшит и страничку в виндовом кэше, какая ему разница. Если кэша хватит, конечно :)

Re: Reply to your comment...

[identity profile] a-konst.livejournal.com 2007-12-25 08:08 am (UTC)(link)
разница в том, что у проца кеш не очень большой, и если кеш файла "виндовый", то этот кеш и пользовательские данные лежат в разных сегментах обычной памяти, и их обоих кешить тяжелее.
Что-то мне подсказывает, что кеш процессора работает тоже довольно крупными цельными блоками.

Re: Reply to your comment...

[identity profile] 1ceheart.livejournal.com 2007-12-25 11:25 am (UTC)(link)
Не, ничего подобного. Cache line в L1 - вообще 64 байта, а в L2 - что-то типа 128, от проца зависит, но тоже немного. Меньше страницы, в любом случае.

Доля истины есть в том, что если прога, грубо говоря, читает по байту, вызывая каждый раз ReadFile, то между двумя последовательными вызовами ReadFile произойдет очень много всего - context switch, всякое прочее, и вероятность того, что вследствие этого "всякого прочего" нужные данные из кэша будут вытеснены, больше, чем если прога просто тупо делает memcpy из своего внутреннего кэша.

Но в реальности, если мы говорим действительно о небольших кусках данных - типа байт 16 - то это все равно пренебрежимо мало по сравнению с объемом кода, который нужно выполнить, чтобы все-таки скопировать эти 16 байт. Поэтому скорость в итоге определяется той разницей, что проге в user space потребуется выполнить, ну, грубо, килобайт кода, чтобы добраться до этих данных, а ReadFile - ну, килобайт 20-30.