比预期的Java正则表达式性能慢

IOI*_*upt 8 php java regex

我的任务是读取大型CSV文件(300k +记录)并将regexp模式应用于每条记录.我一直是一名PHP开发人员,从未真正尝试过任何其他语言,但决定我应该尝试使用Java,我认为这会更快.

事实上,只是逐行读取CSV文件在Java中快了3倍.然而,当我应用了正则表达式的要求,Java实现被证明会比PHP脚本长10-20%.

我很有可能在Java中做错了什么,因为我就像今天一样学到了这一点.以下是两个脚本,任何建议将不胜感激.我真的不想放弃这个特定项目的Java.

PHP代码

<?php
$bgtime=time();
$patterns =array(
    "/SOME REGEXP/",
    "/SOME REGEXP/",                    
    "/SOME REGEXP/",    
    "/SOME REGEXP/" 
);   

$fh = fopen('largeCSV.txt','r');
while($currentLineString = fgetcsv($fh, 10000, ","))
{
    foreach($patterns AS $pattern)
    {
        preg_match_all($pattern, $currentLineString[6], $matches);
    }
}
fclose($fh);
print "Execution Time: ".(time()-$bgtime);

?>
Run Code Online (Sandbox Code Playgroud)

JAVA CODE

import au.com.bytecode.opencsv.CSVReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.ArrayList;

public class testParser
{
    public static void main(String[] args)
    {
        long start = System.currentTimeMillis();


        String[] rawPatterns = {
                    "SOME REGEXP",
                    "SOME REGEXP",                    
                    "SOME REGEXP",    
                    "SOME REGEXP"    
        };

        ArrayList<Pattern> compiledPatternList = new ArrayList<Pattern>();        
        for(String patternString : rawPatterns)
        {
            Pattern compiledPattern = Pattern.compile(patternString);
            compiledPatternList.add(compiledPattern);
        }


        try{
            String fileName="largeCSV.txt";
            CSVReader reader = new CSVReader(new FileReader(fileName));

            String[] header = reader.readNext();
            String[] nextLine;
            String description;

            while( (nextLine = reader.readNext()) != null) 
            {
                description = nextLine[6];
                for(Pattern compiledPattern : compiledPatternList)
                {
                    Matcher m = compiledPattern.matcher(description);
                    while(m.find()) 
                    {
                        //System.out.println(m.group(0));
                    }                
                }
            }
        }

        catch(IOException ioe)
        {
            System.out.println("Blah!");
        }

        long end = System.currentTimeMillis();

        System.out.println("Execution time was "+((end-start)/1000)+" seconds.");
    }
}
Run Code Online (Sandbox Code Playgroud)

hoi*_*loi 3

我没有发现您的代码有任何明显的错误。尝试使用分析器隔离性能瓶颈。我发现netbeans分析器非常用户友好。

编辑:为什么要推测?分析应用程序并获取有关时间花费情况的详细报告。然后努力解决低效领域。有关详细信息,请参阅http://profiler.netbeans.org/ 。

EDIT2:好的,我感到无聊并对此进行了分析。我的代码与你的相同,并解析了包含 1,000 行相同行的 CSV 文件,如下所示:

SOME REGEXP,SOME REGEXP,SOME REGEXP,SOME REGEXP,SOME REGEXP,SOME REGEXP,SOME REGEXP,SOME REGEXP,SOME REGEXP,SOME REGEXP
Run Code Online (Sandbox Code Playgroud)

这是结果(显然你的结果会有所不同,因为我的正则表达式很简单)。然而,很明显,正则表达式处理不是您关注的主要领域。

在此输入图像描述

有趣的是,如果我应用 BufferedReader,性能将提升高达 18%(见下文)。

在此输入图像描述