Perl或C在解析时速度更快吗?

Alp*_*neo 19 c optimization perl parsing

我有一些非常大的日志文件,我需要解析它们.易于实现显然指向Perl和regex组合(我仍然是新手).但速度怎么样?在C中实现它会更快吗?每个日志文件大约为2 GB.

pax*_*blo 43

我非常怀疑除非你手工编译RE,否则C将比Perl更快.

通过手工编译,我的意思是直接编码有限状态机(FSM)而不是使用RE引擎来编译它.这种方法意味着您可以针对特定情况对其进行优化,这通常比依赖更通用的引擎更快.

但是,如果没有lex,yacc,bison或其他类似工具的好处,那么我就不会向没有编写编译器或解析器的人提出这个建议.

通用引擎,例如PCRE,通常功能强大且足够快(无论如何,我的需求,并且这些需求通常非常苛刻).

当使用通用RE引擎时,它需要能够处理各种情况,无论它是用C还是Perl编写的.当您考虑哪个更快时,您只需要比较两种情况下RE引擎的编写内容(提示:Perl RE引擎不是用Perl编写的).

它们都是用C语言编写的,所以你应该在匹配速度方面找到很小的差别.

可能会发现RE周围的支持代码存在差异,但这种差异很小,特别是如果它是一个简单的读/匹配/输出循环.


cha*_*aos 21

  • 一个天真的基于Perl正则表达式的解析器将比天真编写的基于C正则表达式的解析器更快.
  • 一个写得很好的Perl的正则表达式基础的解析器将大大超过天真编写的C基于正则表达式解析器更快.
  • 一个编写良好的基于​​C正则表达式的解析器将比编写良好的基于​​Perl正则表达式的解析器快一点.(它的写入速度也是其两倍,调试难度也要高十倍.)

  • (1)正则表达式是迄今为止解析事物的最快方式...尤其是日志.(2)一个编写良好的基于​​c regex的解析器将比perl解析器更难写入/调试...因为perl regexen"Just Work(TM)" (2认同)

zou*_*oul 20

Perl正则表达式匹配器经过了大量优化.这是Perl的亮点,在Perl中使用2GB文件应该没有问题,性能应该很容易与C版本相媲美.顺便说一句:您是否尝试寻找已经完成的日志解析器?有很多.


dao*_*oad 17

如果你同样熟练使用C和Perl,答案很简单:

  1. 用Perl写.
  2. 如果它太慢,请对其进行分析并修复它.
  3. 如果它仍然太慢,并且问题是CPU或RAM使用率过高,请考虑将其写入C.

一般来说,我会说这适用,除非你是某种C godlet,可以通过强力操纵指针和类型转换灵巧地操纵现实的基础.

说真的,perl中的正则表达式实现非常快速,灵活且经过了充分测试.您编写的任何代码都可能快速而灵活,但它永远不会经过彻底的测试.

由于您是Perl和regex的新手,因此请务必记住,如果您需要,有些资源可以您提供出色的帮助.甚至有一些很好的教程精细的手工.

无论你做什么,都不要这样做:

for my $line ( <$log> ) {
    # parse line here.
}
Run Code Online (Sandbox Code Playgroud)

您将把整个日志文件读入内存,当系统交换和交换(并可能崩溃)时,它将永远存在.

而是使用while循环:

while (defined( my $line = <$log> )) {
    # parse line here.
}
Run Code Online (Sandbox Code Playgroud)

  • 我不是Perl专家.为什么片段正在读取整个文件?是否与事先必须知道旋转多少次,而每次检查时有什么关系? (2认同)

小智 13

如果你真的需要使用正则表达式,那么Perl正则表达式引擎很难被击败.但是,如果没有它们,可以更有效地解决许多解析问题 - 例如,如果您只需要在某个字符处拆分一条线,在这种情况下C可能会更快.

如果性能是最重要的,那么你应该尝试两种语言,并测量速度差异.否则,只需使用您最熟悉的那个.


yst*_*sth 8

我猜测(代替对Alphaneo实际数据的基准测试,我没有),I/O处理将成为这里的边界因素.而且我希望perl上的Perl实现能够启用usefaststdio以匹配或击败基本的C实现,但是如果没有usefaststdio则要明显更慢.(默认情况下,对于大多数平台,usefaststdio在perl 5.8和更早版本中处于启用状态,默认情况下在perl 5.10中处于关闭状态.)


inn*_*naM 7

速度真的是一个因素吗?你真的在乎是否在5或10分钟后完成解析?

寻找提供最佳解析功能且您最熟悉的语言或工具.