package org.nutz.el.speed;
import org.nutz.el.El;
import org.nutz.lang.Lang;
import org.nutz.lang.Stopwatch;
import org.nutz.lang.Strings;
import org.nutz.lang.util.Context;
import org.nutz.trans.Atom;
/**
* 一个基本的速度测试。 同 Java 代码相比,大约慢了 100-300倍 随着表达式的复杂,会更慢
s*
* @author zozoh(zozohtnt@gmail.com)
*/
public class SimpleSpeedTest {
static int max = 50000;
static int i = 0;
public int abc(int i) {
return i % 13;
}
public static void main(String[] args) throws SecurityException, NoSuchMethodException {
final SimpleSpeedTest z = new SimpleSpeedTest();
final String elstr = "num + (i - 1 + 2 - 3 + 4 - 5 + 6 - 7)-z.abc(i)";
final Context context = Lang.context("{num:0}");
context.set("z", z);
System.out.println("\n" + Strings.dup('=', 100));
Stopwatch sw = Stopwatch.run(new Atom() {
public void run() {
int num = 0;
for (int i = 0; i < max; i++)
num = num + (i - 1 + 2 - 3 + 4 - 5 + 6 - 7) - z.abc(i);
System.out.println("Num: " + num);
}
});
System.out.println("\n" + Strings.dup('=', 100));
Stopwatch sw3 = Stopwatch.run(new Atom() {
public void run() {
try {
context.set("num", 0);
for (int i = 0; i < max; i++)
context.set("num", El.eval(context.set("i", i), elstr));
System.out.println("Num: " + context.getInt("num"));
}
catch (Exception e) {
throw Lang.wrapThrow(e);
}
}
});
System.out.println("\n" + Strings.dup('=', 100));
Stopwatch sw4 = Stopwatch.run(new Atom() {
public void run() {
try {
El el2pre = new El(elstr);
context.set("num", 0);
context.set("z", z);
for (int i = 0; i < max; i++)
context.set("num", el2pre.eval(context.set("i", i)));
System.out.println("Num: " + context.getInt("num"));
}
catch (Exception e) {
throw Lang.wrapThrow(e);
}
}
});
System.out.println("\n" + Strings.dup('=', 100));
Stopwatch sw5 = Stopwatch.run(new Atom() {
public void run() {
try {
El el2pre = new El(elstr);
context.set("num", 0);
context.set("z", z);
for (int i = 0; i < max; i++)
context.set("num", el2pre.eval(context.set("i", i)));
System.out.println("Num: " + context.getInt("num"));
}
catch (Exception e) {
throw Lang.wrapThrow(e);
}
}
});
System.out.println("\n" + Strings.dup('=', 100));
System.out.printf("\n%20s : %s", "Invoke", sw.toString());
System.out.printf("\n%20s : %s", "Reflect", sw3.toString());
System.out.printf("\n%20s : %s", "Reflect", sw4.toString());
System.out.printf("\n%20s : %s", "Reflect", sw5.toString());
System.out.println();
}
}