Как указывалось ранее, файловая система имеет собственный механизм кэширования, который нарушает ваши измерения.
Однако конструктор FileStream
выполняет несколько задач, которые в первый раз стоят дорого и требуют доступа к файловой системе (следовательно, чего-то, чего может не быть в кэше данных). По понятным причинам вы можете взглянуть на код и увидеть, что классы CompatibilitySwitches
используются для обнаружения использования подфункции. Вместе с этим классом Reflection интенсивно используется как напрямую (для доступа к текущей сборке), так и косвенно (для защищенных разделов CAS, требований к каналу безопасности). Механизм Reflection имеет свой собственный кэш и требует доступа к файловой системе, когда его собственный кэш пуст.
Немного странно, что эти два измерения настолько разные. В настоящее время у нас есть что-то похожее на наших машинах, на которых установлено антивирусное программное обеспечение с защитой в реальном времени. В этом случае антивирусное программное обеспечение находится посередине, и кэш сбивается или пропускается первый раз в зависимости от реализации такого программного обеспечения.
Антивирусное программное обеспечение может принять решение об активной проверке определенных файлов изображений, таких как PNG, из-за известных уязвимостей декодирования. Такие проверки вносят дополнительное замедление и учитывают время во внешнем классе .NET, то есть в классе FileStream
.
Профилирование с использованием нативных символов и / или с отладкой ядра должно дать вам больше знаний.
Исходя из моего опыта, то, что вы описываете, не может быть смягчено, поскольку существует множество скрытых слоев вне нашего контроля. В зависимости от вашего использования, которое мне не совсем понятно в данный момент, вы можете превратить приложение в службу, поэтому вы сможете быстрее обслуживать все последующие запросы. В качестве альтернативы вы можете объединить несколько запросов в один вызов, чтобы получить амортизированную сниженную стоимость.