2010-04-15 4 views
2

Я пишу несколько программ на C для встроенной системы, где каждый бит производительности, который мы можем выжать, будет иметь значение. Частью этого является доступ к файлам журналов. При определении того, существует ли файл, существует ли разница в производительности между использованием open/fopen и stat? Я использовал stat, исходя из предположения, что он должен выполнить быструю проверку файловой системы, тогда как fopen должен будет фактически получить доступ к файлу и манипулировать внутренними структурами данных перед возвратом. Есть ли какая-то заслуга в этом?Производительность fopen vs stat

+6

Было бы очень легко написать небольшую программу для проверки этого, что и должно быть сделано для всех проблем, связанных с производительностью. – 2010-04-15 16:41:18

ответ

6

stat, вероятно, лучше, поскольку ему не нужно выделять ресурсы для фактического чтения файла. Вам не нужно будет звонить fclose, чтобы освободить эти ресурсы, и вы также можете воспользоваться кэшированием недавно проверенных файлов.

Если у вас есть сомнения, проверьте его. Время большой цикл, который проверяет 1000 файлов, используя каждый метод, с соответствующим сочетанием имен файлов, которые существуют и не существуют.

Если у вас есть исходный код для stat и fopen, вы должны быть в состоянии прочитать его и получить представление о том, для чего потребуется больше ресурсов.

+1

stat действительно имел 3X лучшую производительность для проверки существования файла, чем fopen на наших встроенных ящиках, я был удивлен. Спасибо за предложение. –

3

stat() не создает никаких пользовательских структур данных памяти. Независимо от того, насколько агрессивна ваша политика кэширования, stat не будет пытаться предварительно прочитать данные файла. Я думаю, что stat() - более безопасная ставка.

Как насчет доступа()?

1

Если вы хотите выжать производительность по отношению к поиску файлов и открытию файлов, свести к минимуму количество звонков fopen и stat. Вызов файловой системы должен быть дороже, чем что бы то ни было во время выполнения, чтобы перевести его.

0

Для проверки существования файла, stat() будет предпочтительнее функции fopen().

Однако, в зависимости от вашей установки, было бы целесообразно использовать lstat() вместо stat().

+0

Есть ли разница между stat и lstat, когда файл никогда не является символической ссылкой? –

+0

@JosephGarvin - Не должно быть заметной разницы в производительности, когда файл никогда не является символической ссылкой. – Sparky

Смежные вопросы