1.官方介绍
Janino是一个超小型,超快的Java编译器。
Janino不仅可以将一组源文件编译为一组类文件(如JAVAC),还可以在内存中编译Java表达式,块,类主体或源文件,加载字节码并直接在同一JVM中执行。
JANINO与Apache Commons JCI(“Java编译器接口”)和JBoss Rules / Drools集成在一起。
JANINO还可用于 静态代码分析 或 代码修改。
2.代码示例
修改了下官方的示例代码
/**
* 总耗时秒:2
* 每秒处理条数:10000000
* @throws Exception
*/
@Test
public void IETest2() throws Exception {
String s = "" +
"( \n" +
"\t\te1_deviceCat.equals(\"/Application\") \n" +
"\t || e1_deviceCat.equals(\"/IDS/Network\")\n" +
"\t || e1_deviceCat.equals(\"/Firewall\") \n" +
") \n" +
" && e1_catBehavior.equals(\"/Authentication/Add\")\n" +
" && e1_severity >= 4\n" +
" && e1_catTechnique.equals(\"/TrafficAnomaly/NetWorkLayer\") \n" +
" && e1_catObject.equals(\"/Host/Application/Service\")\n" +
" && !e1_destAddress.equals(\"nil\")\n" ;
// Create "ExpressionEvaluator" object.
IExpressionEvaluator ee = CompilerFactoryFactory.getDefaultCompilerFactory().newExpressionEvaluator();
ee.setExpressionType(boolean.class);
ee.setParameters(
new String[]{"e1_deviceCat", "e1_catBehavior", "e1_severity",
"e1_catTechnique", "e1_catObject", "e1_destAddress"},
new Class[]{String.class, String.class, Integer.class, String.class, String.class,
String.class}
);
ee.cook(s);
int count = 10000 * 4000;
long start = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Object[] arguments = {"/Application", "/Authentication/Add", Integer.valueOf(i),
"/TrafficAnomaly/NetWorkLayer",
"/Host/Application/Service", "1.1.1."+i};
Object res = ee.evaluate(arguments);
}
long end = System.currentTimeMillis();
long interval = (end - start) / 1000;
long avg = count / interval;
System.out.println("总耗时秒:" + interval);
System.out.println("每秒处理条数:" + avg);
}
测试性能很强大
ExpressionEvaluator
数据量:1千万
总耗时秒:1
每秒处理条数:10200000 (1000万)
数据量:2千万
总耗时秒:2
每秒处理条数:10000000 (1000万)
数据量:4千万
总耗时秒:5
每秒处理条数:8000000 (800万)
总耗时秒:3
每秒处理条数:13333333 (1300万)
数据量:8千万
总耗时秒:7
每秒处理条数:11428571 (1100万)