Есть небольшое преимущество. Найдите 'LBYL vs EAFP' или "Посмотрите, прежде чем прыгать" или "Проще Просите прощения, а не разрешения».
Небольшое преимущество заключается в том, что системный вызов stat()
должен проанализировать имя каталога и добраться до индексного дескриптора — или в данном случае отсутствующего индексного дескриптора — а затем mkdir()
должен сделать то же самое. Конечно, данные, необходимые для mkdir()
, уже находятся в пуле буферов ядра, но это все еще требует двух обходов указанного пути вместо одного. Таким образом, в этом случае использование EAFP немного эффективнее, чем использование LBYL, как вы это делаете.
Однако вопрос о том, является ли это действительно измеримым эффектом в средней программе, является весьма спорным. Если вы ничего не делаете, кроме создания каталогов повсюду, вы можете обнаружить преимущество. Но это определенно небольшой эффект, практически неизмеримый, если вы создаете один каталог в начале программы.
Возможно, вам придется иметь дело со случаем, когда strcmp(dir, "/some/where/or/another") == 0
, но хотя "/some/where"
существует, ни "/some/where/or"
, ни (по необходимости) "/some/where/or/another"
не существуют. Ваш текущий код не обрабатывает отсутствующие каталоги в середине пути. Он просто сообщает ENOENT, о котором сообщит mkdir()
. Ваш код, который выглядит, также не проверяет, что dir
на самом деле является каталогом - он просто предполагает, что если он существует, то это каталог. Правильная обработка этих вариаций сложнее.
person
Jonathan Leffler
schedule
11.06.2011