Perl или C быстрее при парсинге?

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

Когда вы сталкиваетесь с проблемой, подобной этой, зарегистрируйте фактическое значение, чтобы вы могли подтвердить, что оно соответствует ожидаемому типу / форме, например:

var result: Equipment = this.addEquipment.value;
console.log(result);

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

var createEquipment = new CreateEquipment();

Если это проблема, войдите в систему, чтобы увидеть, что вы фактически назначаете:

console.log(result.name, result);
createEquipment.name = result.name; 

Ваш вопрос предполагает, что result.name не содержит того, что вы думаете, что оно делает.


Просмотр обновленного снимка экрана показывает, что проблема в том, что объект JavaScript времени выполнения использует PascalCase , но тип предполагает camelCase . Если вы используете ServiceStack с .NET Core, то по умолчанию должно быть с использованием camelCase , если вы не перезаписали его каким-либо образом, например, с помощью JsConfig.*, или не заставили его использовать PascalCase.

Если вы не используете .NET Core, вы можете вызвать camelCase с помощью:

SetConfig(new HostConfig { 
    UseCamelCase = true 
});

19
задан paxdiablo 15 April 2009 в 12:21
поделиться

14 ответов

Я очень сомневаюсь, что C будет быстрее, чем Perl, если вы не должны были вручную скомпилировать RE.

ручная компиляция, я имею в виду кодирование конечного автомата (FSM) напрямую, а не использование механизма RE для его компиляции. Этот подход означает, что вы можете оптимизировать его для своего конкретного случая, который часто может быть быстрее, чем полагаться на более универсальный движок.

Но это не то, что я бы никогда не предложил тем, кому не приходилось писать компиляторы или парсеры. раньше без использования lex, yacc, bison или других подобных инструментов.

Обобщенные движки, такие как PCRE, обычно достаточно мощные и достаточно быстрые (в любом случае, для моих нужд, и эти потребности часто были очень . ] требуя).

При использовании обычного механизма RE он должен уметь обрабатывать все виды случаев, будь то написано на C или Perl. Когда вы думаете о том, что быстрее, вам нужно сравнить только то, в чем написаны движки RE для обоих случаев (подсказка: движок Perl RE не написан на Perl).

Они оба написано на C, так что вы должны найти очень мало различий с точки зрения скорости сопоставления.

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

43
ответ дан 30 November 2019 в 01:44
поделиться

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

if (/ [a-zA-Z] + / o)

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

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

1
ответ дан 30 November 2019 в 01:44
поделиться

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

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

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

1
ответ дан 30 November 2019 в 01:44
поделиться

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

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

2
ответ дан 30 November 2019 в 01:44
поделиться

Да, вы можете сделать намного более быстрый анализатор в C, если знаете, что делаете.

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

3
ответ дан 30 November 2019 в 01:44
поделиться

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

4
ответ дан 30 November 2019 в 01:44
поделиться

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

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

3
ответ дан 30 November 2019 в 01:44
поделиться

Является ли скорость действительно фактором здесь? Тебя действительно волнует, выполняется ли разбор через 5 или 10 минут?

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

7
ответ дан 30 November 2019 в 01:44
поделиться

Я предполагаю (вместо сравнения с фактическими данными Alphaneo, которых у меня нет), что я / Обработка будет ограничивающим фактором здесь. И я ожидаю, что реализация Perl на perl с включенным usefaststdio будет соответствовать или превосходить базовую реализацию C, но будет заметно медленнее без usefaststdio. (usefaststdio был включен по умолчанию в perl 5.8 и более ранних версиях для большинства платформ и выключен по умолчанию в perl 5.10.)

8
ответ дан 30 November 2019 в 01:44
поделиться

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

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

и измерить разницу скоростей. В противном случае просто используйте тот, который вам удобнее всего.

и измерить разницу скоростей. В противном случае просто используйте тот, который вам удобнее всего.

13
ответ дан 30 November 2019 в 01:44
поделиться

Если вы одинаково разбираетесь в C и Perl, ответ прост:

  1. Напишите это на Perl.
  2. Если он слишком медленный, профилируйте его и исправьте.
  3. Если он все еще слишком медленный, и проблема заключается в чрезмерном использовании ЦП или ОЗУ, подумайте о том, чтобы записать его на C.

Как правило, я бы сказал, что это применимо, если только вы не являетесь каким-то языком C, который может ловко манипулировать основы реальности посредством манипулирования указателями и типами типов.

Серьезно, реализация регулярного выражения в Perl очень быстрая, гибкая и хорошо проверенная. Любой код, который вы пишете, может быть быстрым и гибким, но он никогда не может быть так тщательно протестирован.

Поскольку вы новичок в Perl и regex, важно помнить, что существуют ресурсы , которые могут ] предоставим вам отличную помощь , если вам это нужно. Есть даже несколько хороших руководств в прекрасном руководстве .

Что бы вы ни делали, не делайте этого:

for my $line ( <$log> ) {
    # parse line here.
}

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

Вместо этого используйте цикл while:

while (defined( my $line = <$log> )) {
    # parse line here.
}
17
ответ дан 30 November 2019 в 01:44
поделиться

Средство сопоставления регулярных выражений Perl сильно оптимизировано. Это то место, где светит Perl, у вас не должно возникнуть проблем при работе с файлом объемом 2 ГБ в Perl, а производительность должна быть легко сопоставима с версией C. Кстати: вы пытались искать уже готовый парсер журнала? Их много.

20
ответ дан 30 November 2019 в 01:44
поделиться

В прошлом я обнаружил, что C быстрее, но не в той степени, в которой выбор был предрешен .

Задумывались ли вы об использовании универсального инструмента Log Parser, такого как Log Parser :

Log Parser - мощный, универсальный инструмент, который обеспечивает универсальный запрос доступ к текстовым данным, таким как журнал файлы, файлы XML и файлы CSV, а а также ключевые источники данных на Операционная система Windows®, такая как Журнал событий, реестр, файл system и Active Directory®.

На этом сайте перечислены несколько общих анализаторов журнала.

4
ответ дан 30 November 2019 в 01:44
поделиться
  • Наивно написанный синтаксический анализатор на основе регулярных выражений Perl будет работать быстрее, чем наивно написанный синтаксический анализатор на основе регулярных выражений Си.
  • Хорошо написанный парсер на основе регулярных выражений Perl будет значительно быстрее, чем наивно написанный синтаксический анализатор на основе C.
  • Хорошо написанный парсер на основе регулярных выражений C будет несколько быстрее, чем хорошо написанный Perl-регулярный синтаксический анализатор. (Писать также будет вдвое труднее, а отладку - в десять раз.)
21
ответ дан 30 November 2019 в 01:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: