Действительно ли системный вызов stat()
стоит дорого? Я где-то читал, что это дорогостоящий системный вызов. Это правда? Если да, то есть ли другие альтернативы?
Является ли stat() дорогостоящим системным вызовом?
Ответ 1
В типичной настройке stat(2)
, fstat(2)
и lstat(2)
являются единственными разумными методами получения информации о файле. Если вы видите проблемы с производительностью, было бы полезно профилировать ваше приложение и посмотреть, что произойдет.
В профиле скомпилируйте с помощью gcc -pg
и запустите исполняемый файл с помощью gprof(1)
.
Вы могли бы, возможно, переключиться на использование более крупной библиотеки, такой как Qt, но это вряд ли справится с проблемами производительности, и они, вероятно, будут использовать stat(2)
в любом случае.
Итак, насколько это дорого или нет, нет разумных альтернатив.
Тем не менее, как и в комментарии Джима Макнамары, это не дорого по этим причинам. Поскольку нет другой альтернативы, программисты glibc и linux сделали ее максимально возможной.
Ответ 2
Вы всегда можете использовать strace
для своего исполняемого файла. Нет необходимости перекомпилировать. Эта функция позволяет вам получить фактическое время выполнения для каждого системного вызова.
Ответ 3
Возникает вопрос: "Дорогой v/s обязательно".
Каждый процесс в Unix работает в двух режимах: "Пользовательское пространство" и "Ядро пространства", а когда вызывается системные вызовы типа open(), write(), stat(), процесс переходит из пользовательского пространства в ядро Режим, который является дорогостоящим, но только если мы не делаем ничего значимого в этом системном вызове. Как если бы вы использовали stat(), чтобы печатать только последнее время доступа к файлу, и больше ничего не делаем, то, вероятно, этого следует избегать.
Итак, во-первых, должна быть веская причина для вызова stat(). Во-вторых, если вы хотите сравнить относительное время выполнения различных частей кода, используйте любой инструмент профилирования, который предоставит вам точную статистику, чтобы доказать, какой вызов функции дорог, а какой нет.