|
|
|||||||||||||||||||||||||||||
|
Использование gperf для эффективной обработки параметров командной строки в C/C++ (исходники)Источник: IBM developerWorks Россия Арпан Сен, Рахул Кардам
Обработка параметров командной строки и необходимость gperfИсторически обработка параметров командной строки является одной из областей разработки программного обеспечения, которым уделяется наименьшее внимание. Практически у любого более или менее сложного программного обеспечения существует множество параметров командной строки. На самом деле, нет ничего необычного в сотнях строк кода с операторами
Вместо программного интерфейса API из ANSI C разработчик C++, скорее всего, будет использовать строковые функции из стандартной библиотеки шаблонов (Standard Template Library, STL). Однако же, и здесь не уйти от вложенных последовательностей операторов Здесь в игру вступает gperf. Он создает хеш-таблицу на основе предварительно заданного списка разрешенных параметров командной строки, а также функцию поиска, временная сложность которой составляет O(1). Таким образом, для вызова обычной программы с N параметрами код должен выполнить только O(N) [N*O(1)] сравнений, что обозначает увеличение производительности на порядок по сравнению с обычным кодом. Особенности использования gperfGperf считывает набор ключевых слов из файла, предоставляемого пользователем (обычно это файл с расширением .gperf, хотя это и не обязательно), например, commandoptions.gperf, и создает исходный код C/C++ для хеш-таблицы, методов хеширования и поиска. Код направляется на стандартный вывод, который может быть перенаправлен в файл следующим образом:
Примечание: Параметр Формат входного файла gperfВ Листинге 2 представлен формат входного файла gperf. Листинг 2. Формат входного файла gperf
Формат состоит из нескольких элементов: включение кода C, объявления, ключевые слова и функции. Включение кода CВключение кода C представляет собой необязательную секцию, заключенную между ОбъявленияСекция объявлений также необязательна; вы можете полностью опустить ее содержимое, если не будете вызывать gperf с параметром Впрочем, в gperf существует возможность изменения названия первого поля путем использования параметра
В Листинге 3 представлены разделы включения кода C и объявлений. Листинг 3. Секции включения кода C и объявлений
Ключевые словаВ этой секции содержатся ключевые слова - в данном случае это предварительно определенные аргументы командной строки. Каждая строка этого раздела, начинающаяся со знака # в первой позиции, является комментарием. На первом месте каждой незакомментированной строки указывается ключевое слово, кавычки, обычно связываемые с типом
Как видно из Листинга 3, первая запись соответствует полю ФункцииФункции - это еще одна необязательная секция. Текст этой секции начинается с символов Выходной файл gperfGperf хеширует заранее определенный набор ключевых слов, после чего выполняет быстрый поиск по этим словам. В соответствии с этой методикой, gperf выводит две функции: Примечание: Для того, чтобы изменить название создаваемого класса, используйте параметр Прототип функции хеширования имеет следующий вид:
где Функцией поиска в хеше, созданном gperf, является Например, в Листинге 3 определена структура
Основные параметры gperfGperf является гибко настраиваемым инструментом, принимающим несколько параметров. Все параметры gperf описаны в онлайновом справочнике (смотри ссылку в разделе Ресурсы), в их число входят:
Обзор внутренней структуры gperfСтатическое поисковое множество (Static search set) представляет собой абстрактный тип данных с операциями
Внутренняя реализация gperf построена на двух структурах данных: списке ключей ключевых слов ( Массив связанных значений генерируется в функции В случае, когда k = n, создается минимальная идеальная функция
Пример проектаЧтобы проиллюстрировать изложенный выше материал, рассмотрим небольшой проект. Посмотрите на файл gperf, приведенный в Листинге 5. Листинг 5. command_options.gperf
В листинге 6 показан файл заголовка
Вызов gperf из командной строки будет выглядеть следующим образом:
Хеш-таблица генерируется в файле perfecthash.hpp. Поскольку в командной строке был указан параметр
И, наконец, в Листинге 8 показан основной исходный код. Примечание: Листинг 8 показывает, что вы можете найти любой параметр командной строки в заданном перечне ключевых слов за неизменное время, и, следовательно, принять необходимые меры для обработки этого параметра. Временная сложность
Примечания: Все примеры, приведенные в этой статье, были проверены с помощью gperf версии 3.0.3. Если вы используете более раннюю версию, то при вызове может потребоваться указание параметра ЗаключениеУтилита gperf настроена на быстрое формирование идеального хеша для небольших и средних множеств данных. Однако у gperf также есть другие области применения. Фактически, это лучший инструмент для работы с идеальными хешами для ключевых слов в компиляторах GNU, а последние усовершенствования также позволяют вам работать с более крупными массивами данных. Попробуйте использовать gperf в вашем следующем проекте.
|
|