Perl или C быстрее при разборе? - PullRequest
19 голосов
/ 13 апреля 2009

У меня есть несколько очень больших файлов журналов, и мне нужно их проанализировать. Простота реализации, очевидно, указывает мне на Perl и регулярное выражение (в котором я еще новичок) Но как насчет скорости? Будет ли быстрее реализовать его в C? Каждый файл журнала имеет порядок 2 ГБ.

Ответы [ 15 ]

3 голосов
/ 13 апреля 2009

Частично это зависит от того, как синтаксический анализ будет интегрирован в приложение. Если приложение является парсером, то с Perl все будет в порядке, просто благодаря тому, что оно будет обрабатывать все, что его окружает, но если оно НЕПОСРЕДСТВЕННО интегрировано в более крупное приложение, то вполне возможно, что вы захотите посмотреть что-то вроде Lex ( или Flex в наши дни): http://en.wikipedia.org/wiki/Lex_(software) Этот инструмент создает парсер для вас, и вы можете интегрировать код C / C ++ непосредственно в свое программное обеспечение.

Что касается соображений скорости, я согласен с большинством других респондентов, что зрелость используемой библиотеки будет доминирующим фактором, а Perl ОЧЕНЬ зрел. Я не знаю, насколько зрелы некоторые из других библиотек (например, регулярное выражение, доступное для C ++ от Boost), но, поскольку большая часть вашего времени обработки будет находиться в библиотеке, языковые проблемы, скорее всего, вторичны.

Итог: используйте то, что вам наиболее удобно, и выполняйте как можно больше работы внутри библиотеки, поскольку это почти всегда быстрее, чем то, что вы можете создать самостоятельно, на любом языке.

2 голосов
/ 13 апреля 2009

Если вы опытный в Perl, используйте его. В противном случае используйте AWK и SED.

Разбор текста - это не то, что вы хотите сделать с C.

1 голос
/ 03 декабря 2010

Если вы хотите прочитать 2 Гб на perl, лучше использовать sysread (с большим размером блока, например, 256 КБ или 512 КБ). PerlIO использует слишком маленький размер блока - 4 Кб, это неэффективно. См. PerlMonks для получения дополнительной информации о размере блока PerlIO.

1 голос
/ 14 апреля 2009

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

, если (/ [A-Za-Z] + / о)

Это приведет к тому, что выражение будет скомпилировано внутри только один раз, и этот результат впоследствии будет использоваться повторно, а не на каждой последующей итерации цикла.

Вооружившись этим улучшением, я был бы очень удивлен, если бы ваш парсер Perl не прошел всю реализацию C, которую вы, возможно, смогли бы придумать за реалистичное время.

1 голос
/ 13 апреля 2009

Если вы анализируете журналы в общем формате журналов Apache, посетителей , написанных на C, превзойдет любой сопоставимый синтаксический анализатор perl по крайней мере в 2 раза.

Поэтому найдите существующие парсеры и сравните их, если формат журнала общий.

Правильно написанный анализатор журнала в C всегда будет значительно быстрее, чем правильно написанный анализатор журнала в Perl, исходя из моего прошлого опыта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...