Более медленная, чем ожидалось, производительность регулярных выражений Java

Мне было поручено читать большие файлы CSV (более 300 тыс. Записей) и применять шаблоны регулярных выражений к каждой записи. Я всегда был разработчиком PHP и никогда особо не пробовал какие-либо другие языки, но решил, что мне следует нырнуть и попытаться сделать это с помощью Java, который, как я предполагал, будет намного быстрее.

Фактически, просто прочитав строку файла CSV, line была в 3 раза быстрее на Java. Однако, когда я применил требования к регулярному выражению, реализация Java оказалась на 10-20% дольше, чем сценарий PHP.

Вполне возможно, что я сделал что-то не так на Java, потому что я узнал об этом только сегодня, когда учился. Ниже приведены два сценария, мы будем благодарны за любые советы. Я действительно хотел бы не отказываться от Java для этого конкретного проекта.

PHP CODE

<?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);

?>

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.");
    }
}
8
задан Alan Moore 12 February 2012 в 00:54
поделиться