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
zou*_*oul 20
Perl正则表达式匹配器经过了大量优化.这是Perl的亮点,在Perl中使用2GB文件应该没有问题,性能应该很容易与C版本相媲美.顺便说一句:您是否尝试寻找已经完成的日志解析器?有很多.
dao*_*oad 17
如果你同样熟练使用C和Perl,答案很简单:
一般来说,我会说这适用,除非你是某种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)
小智 13
如果你真的需要使用正则表达式,那么Perl正则表达式引擎很难被击败.但是,如果没有它们,可以更有效地解决许多解析问题 - 例如,如果您只需要在某个字符处拆分一条线,在这种情况下C可能会更快.
如果性能是最重要的,那么你应该尝试两种语言,并测量速度差异.否则,只需使用您最熟悉的那个.
我猜测(代替对Alphaneo实际数据的基准测试,我没有),I/O处理将成为这里的边界因素.而且我希望perl上的Perl实现能够启用usefaststdio以匹配或击败基本的C实现,但是如果没有usefaststdio则要明显更慢.(默认情况下,对于大多数平台,usefaststdio在perl 5.8和更早版本中处于启用状态,默认情况下在perl 5.10中处于关闭状态.)