ファイルの読み取りが遅く、antlr文法で解析するプログラムがあります。これのパフォーマンスを向上させるために、解析をマルチスレッド化したいと思いますか?
ファイルの読み取り:
LogParser pa = new LogParser();
LogData logrow;
String inputLine;
int a=0;
try {
//feed line by line
FileReader fr = new FileReader(jFileChooser1.getSelectedFile());
BufferedReader reader = new BufferedReader(fr);
while ((inputLine = reader.readLine()) != null)
{
try {
a++;
jProgressBar.setValue(a);
pa.parse(inputLine); //decode the line
} catch ... catches errors and send to logger
} finally {
logrow=new LogData(pa,a);
mLogTable.addRow(logrow);//store the decoded line
}
}
reader.close();
} catch ... catches errors and send to logger
このコードはpa.parse(inputLine);
、入力行を an に送信する行を解析しANTLRStringStream
、次に aCharStream
を解析してから解析します。次にlogrow=new LogData(pa,a);
、テーブルに格納されるデコードされた値を取得します。
私のプロファイリングは、私の文法から構築されたレクサーおよびパーサー クラス (つまり、LogGrammarLexer および LogGrammarParser) にホットスポットがあることを示しています。それが十分に明確であることを願っています...
解析:
LogGrammarLexer lexer = new LogGrammarLexer(inStream);
CommonTokenStream tokens = new CommonTokenStream(lexer);
decoded = new LogGrammarParser(tokens);
try {
failurePosition="";
decoded.logLine();
} catch (RecognitionException e) {
failurePosition=Integer.toString(e.charPositionInLine);
} catch (Exception e) {
failurePosition="-3";
throw e;
} finally {
return decoded;//TODO: see if return is necessary as decoded is now a field in class
}
また、私は読んでいて、マルチスレッドファイルI / Oが役に立たないことを知っています... とにかく、改善する必要があるのは、ファイル内の各行の複雑なデコード/解析を行う文法用に構築されたクラス内のパフォーマンスです.
だから私の問題はそれをマルチスレッドにする方法です、
乾杯