【Janino】Janino Java表達式計算引擎 案例

在這裏插入圖片描述

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萬)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章