package study.java.hanyx.rpn;
import org.mvel2.MVEL;
import study.java.hanyx.rpn.crmPatternExp.Arithmetic;
import com.googlecode.aviator.AviatorEvaluator;
import com.greenpineyu.fel.FelEngine;
/**
* 测试逆波兰表达式
* @author 韩元旭
*/
public class TestRPN {
public static void main(String[] args) {
crmBug();
speed();
}
/**
* 测试CRM的逆波兰表达式实现的bug
*/
private static void crmBug() {
//测试逆波兰表达式.
String exp1 = "1-1+1";
System.out.println("1.CRM实现的BUG:");
System.out.println(" " + Arithmetic.calculate(exp1));
System.out.println(" " + ReversePolishNotation.calculate(exp1));
}
/**
* 测试表达式效率
*/
private static void speed() {
System.out.println("2.计算速度:");
int times = 10_0000;
String exp = "1000+100.0*99-(600.0-3*15)/(((68-9)-3)*2-100)+10000.0/7*71";
System.out.println("Answer:"+(1000+100.0*99-(600.0-3*15)/(((68-9)-3)*2-100)+10000.0/7*71));
System.out.println("RPN:"+ReversePolishNotation.calculate(exp));
System.out.println("MVEL:"+MVEL.eval(exp));
System.out.println("Fast-EL:"+FelEngine.instance.eval(exp));
System.out.println("Aviator:"+AviatorEvaluator.execute(exp));
long time = System.currentTimeMillis();
for (int i = 0; i < times; i++) {
ReversePolishNotation.calculate(exp);
}
System.out.println("逆波兰表达式耗时:" + (System.currentTimeMillis() - time) + "ms");
long time1 = System.currentTimeMillis();
for (int i = 0; i < times; i++) {
MVEL.eval(exp);
}
long time2 = System.currentTimeMillis();
System.out.println("MVEL耗时: " + (time2-time1) + " ms");
for (int i = 0; i < times; i++) {
FelEngine.instance.eval(exp);
}
long time3 = System.currentTimeMillis();
System.out.println("Fast-EL耗时: " + (time3-time2) + " ms");
for (int i = 0; i < times; i++) {
AviatorEvaluator.execute(exp);
}
long time4 = System.currentTimeMillis();
System.out.println("Aviator耗时: " + (time4-time3) + " ms");
}
}