莊周夢蝶

          生活、程序、未來
             :: 首頁 ::  ::  :: 聚合  :: 管理

           

              aviator是一個輕量級的、高性能的Java表達式求值器,主要應(yīng)用在如工作流引擎節(jié)點條件判斷、MQ中的消息過濾以及某些特定的業(yè)務(wù)場景。

              自從上次發(fā)布1.0后,還發(fā)過1.01版本,不過都沒怎么宣傳。這次發(fā)布一個2.0的里程碑版本,主要改進如下:


          1、完整支持位運算符,與java完全一致。位預(yù)算符對實現(xiàn)bit set之類的需求還是非常必須的。

          2、性能優(yōu)化,平均性能提升100%,函數(shù)調(diào)用性能提升200%,最新的與groovy和JEXL的性能測試看這里

          http://code.google.com/p/aviator/wiki/Performance

          3、添加了新函數(shù),包括long、double、str用于類型轉(zhuǎn)換,添加了string.indexOf函數(shù)。

          4、完善了用戶手冊,更新性能測試。

           

          下載地址:  http://code.google.com/p/aviator/downloads/list

          項目主頁:  http://code.google.com/p/aviator/

          用戶指南:  http://code.google.com/p/aviator/w/list

          性能報告:  http://code.google.com/p/aviator/wiki/Performance

          源碼:          https://github.com/killme2008/aviator

           

          Maven引用(感謝許老大的幫助):

              <dependency>
                      
          <groupId>com.googlecode.aviator</groupId>
                      
          <artifactId>aviator</artifactId>
                                  
          <version>2.0</version>
              
          </dependency>

               這個項目目前用在我們的MQ產(chǎn)品中做消息過濾,也有幾個公司外的用戶告訴我他們也在用,不過估計不會很多。有這種需求的場景還是比較少的。這個項目實際上是為我們的MQ定制的,我主要想做到這么幾點:

          (1)控制用戶能夠使用的函數(shù),不允許調(diào)用任何不受控制的函數(shù)。

          (2)輕量級,不需要嵌入groovy這么大的腳本引擎,我們只需要一個剪裁過的表達式語法即可。

          (3)高性能,最終的性能在某些場景比groovy略差,但是已經(jīng)非常接近。

          (4)易于擴展,可以容易地添加函數(shù)擴展功能。語法相對固定。

          (5)函數(shù)的調(diào)用避免使用反射。因此沒使用dot運算符的函數(shù)調(diào)用方式,而是更類似c語言和lua語言的函數(shù)調(diào)用風格。函數(shù)是一等公民,seq庫的風格很符合我的喜好。

            seq這概念來自clojure,我將實現(xiàn)了java.util.Collection接口的類和數(shù)組都稱為seq集合,可以統(tǒng)一使用seq庫操作。例如假設(shè)我有個list:

                  Map<String, Object> env = new HashMap<String, Object>();
                  ArrayList
          <Integer> list = new ArrayList<Integer>();
                  list.add(
          3);
                  list.add(
          100);
                  list.add(
          -100);
                  env.put(
          "list", list);

             可以做這么幾個事情,度量大小:
          count(list)
             判斷元素是否存在:
          include(list,3)
             過濾元素,返回大于0的元素組成的seq:
          filter(list,seq.gt(0))
             對集合里的元素求和,應(yīng)用reduce:
          reduce(list,+,0)
             遍歷集合元素并打印:
          map(list,println)
             最后,你還可以排序:
          sort(list)

              這些函數(shù)類似FP里的高階函數(shù),使用起來還是非常爽的。

              對函數(shù)調(diào)用的優(yōu)化,其實只干了一個事情,原來函數(shù)調(diào)用我是將所有參數(shù)收集到一個list里面,然后再轉(zhuǎn)成數(shù)組元素交給AviatorFunction調(diào)用。這里創(chuàng)建了兩個臨時對象:list和數(shù)組。這其實是沒有必要的,我只要在AviatorFunction里定義一系列重載方法,如:
             public AviatorObject call(Map<String, Object> env);


              
          public AviatorObject call(Map<String, Object> env, AviatorObject arg1);


              
          public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2);


              
          public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2, AviatorObject arg3);

              

             就不需要收集參數(shù),而是直接invokeinterface調(diào)用AviatorFunction相應(yīng)的重載方法即可。我看到在JRuby和Clojure里的方法調(diào)用都這樣干的。過去的思路走岔了。最終也不需要區(qū)分內(nèi)部的method和外部的function,統(tǒng)一為一個對象即可,進一步減少了對象創(chuàng)建的開銷。
          主站蜘蛛池模板: 苍山县| 大埔县| 革吉县| 庆云县| 衡阳市| 嘉鱼县| 夹江县| 平谷区| 罗源县| 广饶县| 鸡东县| 双牌县| 特克斯县| 肃南| 葵青区| 嘉定区| 政和县| 台南市| 榆中县| 交城县| 兴仁县| 彰化县| 常州市| 鲜城| 宁强县| 山东省| 遵义县| 万载县| 鄯善县| 城市| 昌邑市| 华阴市| 金门县| 卫辉市| 鹿泉市| 肥西县| 仁化县| 巴林左旗| 平原县| 广饶县| 平江县|