import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import org.jruby.Ruby;
import org.jruby.RubyInstanceConfig;
import org.jruby.common.NullWarnings;
import org.jruby.lexer.yacc.LexerSource;
import org.jruby.parser.Ruby20Parser;
import org.jruby.parser.ParserConfiguration;
public class BenchParser {
public static final int N = 1000;
public static void main(String[] args) {
try {
byte[] bytes = getContents(args);
int iterations = getIterations(args);
int[] parsers = getParsers(args);
System.out.println("Parsing " + args[0] + " " + iterations + " times");
RubyParser parser = new Ruby20Parser();
parser.setWarnings(new NullWarnings(null));
Ruby runtime = Ruby.getGlobalRuntime();
RubyInstanceConfig rconfig = new RubyInstanceConfig();
ParserConfiguration config = new ParserConfiguration(runtime, 0, false, false, true, rconfig);
for (int x = 0; x < parsers.length; x++) {
System.out.println("Benching parse with " + (parsers[x] == 0 ? "InputStream" : "ByteArray") + "LexerSource");
long start = System.nanoTime();
for (int i = 0; i < iterations; i++) {
parser.parse(config, getLexerSource(args[0], bytes, config, parsers[x] == 0));
}
System.out.println("Parse took: " + ((System.nanoTime() - start) * 1.0 / 1000000.0) + "ms");
}
} catch (Exception e) {
System.err.println("Parse bench failed: " + e.getMessage());
e.printStackTrace(System.err);
}
}
private static final LexerSource getLexerSource(String filename, byte[] bytes, ParserConfiguration config, boolean useStream) {
if (useStream) {
return LexerSource.getSource(filename, new ByteArrayInputStream(bytes), null, config);
} else {
return LexerSource.getSource(filename, bytes, null, config);
}
}
private static int getIterations(String[] args) {
if (args.length > 1) {
return Integer.valueOf(args[1]);
} else {
return N;
}
}
private static int[] getParsers(String[] args) {
if (args.length > 2) {
String[] strs = args[2].split(",");
int[] parsers = new int[strs.length > 2 ? 2 : strs.length];
for (int i = 0; i < parsers.length; i++) {
parsers[i] = Integer.valueOf(strs[i]) - 1;
}
return parsers;
} else {
return new int[] {0, 1};
}
}
private static byte[] getContents(String[] args) throws IOException {
InputStream contents = new FileInputStream(args[0]);
ByteArrayOutputStream out = new ByteArrayOutputStream();
int bytesRead = 0;
byte[] buf = new byte[16384];
while ((bytesRead = contents.read(buf)) > 0) {
out.write(buf, 0, bytesRead);
}
contents.close();
return out.toByteArray();
}
}