mirror of
https://github.com/Estom/notes.git
synced 2026-02-04 11:04:21 +08:00
Java内容重新整理删除过期的东西
This commit is contained in:
250
Java/JavaDemo/codedemo/script/MultiScriptEngineCompare.java
Normal file
250
Java/JavaDemo/codedemo/script/MultiScriptEngineCompare.java
Normal file
@@ -0,0 +1,250 @@
|
||||
package cn.aofeng.demo.script;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.script.Bindings;
|
||||
import javax.script.Compilable;
|
||||
import javax.script.CompiledScript;
|
||||
import javax.script.ScriptEngine;
|
||||
import javax.script.ScriptEngineManager;
|
||||
import javax.script.ScriptException;
|
||||
|
||||
/**
|
||||
* 多个脚本引擎执行JavaScript的性能比较。
|
||||
*
|
||||
* @author <a href="mailto:aofengblog@163.com">聂勇</a>
|
||||
*/
|
||||
public class MultiScriptEngineCompare {
|
||||
|
||||
public final static String PARSE = "parse";
|
||||
public final static String COMPILE = "compile";
|
||||
|
||||
/**
|
||||
* 获取指定的脚本引擎执行指定的脚本(解释执行)。
|
||||
*
|
||||
* @param scriptEngineName 脚本引擎名称
|
||||
* @param script 脚本
|
||||
* @param count 脚本的执行次数
|
||||
* @param vars 绑定到脚本的变量集合
|
||||
* @throws ScriptException 执行脚本出错
|
||||
*/
|
||||
public ExecuteResult parse(String scriptEngineName, String script, int count,
|
||||
Map<String, Object> vars) throws ScriptException {
|
||||
ScriptEngine scriptEngine = getScriptEngine(scriptEngineName);
|
||||
long startTime = System.currentTimeMillis();
|
||||
for (int i = 0; i < count; i++) {
|
||||
runSingleScript(script, vars, scriptEngine);
|
||||
}
|
||||
long usedTime = System.currentTimeMillis() - startTime;
|
||||
|
||||
ExecuteResult result = new ExecuteResult();
|
||||
result.setEngine(scriptEngine.getFactory().getEngineName());
|
||||
result.setScript(script);
|
||||
result.setBindParam(vars.toString());
|
||||
result.setExecuteCount(count);
|
||||
result.setExecuteType(PARSE);
|
||||
result.setUsedTime(usedTime);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private void runSingleScript(String script, Map<String, Object> vars,
|
||||
ScriptEngine scriptEngine) throws ScriptException {
|
||||
if (null == vars || vars.isEmpty()) {
|
||||
scriptEngine.eval(script);
|
||||
} else {
|
||||
Bindings binds = createBinding(scriptEngine, vars);
|
||||
scriptEngine.eval(script, binds);
|
||||
}
|
||||
}
|
||||
|
||||
public ExecuteResult compile(String scriptEngineName, String script, int count,
|
||||
Map<String, Object> vars) throws ScriptException {
|
||||
ScriptEngine scriptEngine = getScriptEngine(scriptEngineName);
|
||||
Compilable compileEngine = (Compilable) scriptEngine;
|
||||
CompiledScript compileScript = compileEngine.compile(script);
|
||||
long startTime = System.currentTimeMillis();
|
||||
for (int i = 0; i < count; i++) {
|
||||
runSingleScript(compileScript, vars, scriptEngine);
|
||||
}
|
||||
long usedTime = System.currentTimeMillis() - startTime;
|
||||
|
||||
ExecuteResult result = new ExecuteResult();
|
||||
result.setEngine(scriptEngine.getFactory().getEngineName());
|
||||
result.setScript(script);
|
||||
result.setBindParam(vars.toString());
|
||||
result.setExecuteCount(count);
|
||||
result.setExecuteType(COMPILE);
|
||||
result.setUsedTime(usedTime);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private void runSingleScript(CompiledScript compileScript, Map<String, Object> vars,
|
||||
ScriptEngine scriptEngine) throws ScriptException {
|
||||
if (null == vars || vars.isEmpty()) {
|
||||
compileScript.eval();
|
||||
} else {
|
||||
Bindings binds = createBinding(scriptEngine, vars);
|
||||
compileScript.eval(binds);
|
||||
}
|
||||
}
|
||||
|
||||
protected void log(String msg) {
|
||||
System.out.println(msg);
|
||||
}
|
||||
|
||||
protected void log(String msg, Object... args) {
|
||||
log( String.format(msg, args) );
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据名称获取脚本引擎。
|
||||
*
|
||||
* @param name 脚本引擎名称
|
||||
* @return 实现了{@link ScriptEngine}的脚本引擎。如果没有对应的脚本引擎,返回null。
|
||||
*/
|
||||
public ScriptEngine getScriptEngine(String name) {
|
||||
ScriptEngineManager sem = new ScriptEngineManager();
|
||||
return sem.getEngineByName(name);
|
||||
}
|
||||
|
||||
private Bindings createBinding(ScriptEngine scriptEngine, Map<String, Object> vars) {
|
||||
Bindings binds = scriptEngine.createBindings();
|
||||
if (null != vars && !vars.isEmpty()) {
|
||||
binds.putAll(vars);
|
||||
}
|
||||
|
||||
return binds;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param args 执行次数
|
||||
* @throws ScriptException
|
||||
*/
|
||||
@SuppressWarnings({ "rawtypes", "unchecked" })
|
||||
public static void main(String[] args) throws ScriptException {
|
||||
if ( args.length != 2) {
|
||||
System.err.println("参数错误。\n语法格式:\n java cn.aofeng.demo.script.MultiScriptEngineCompare 脚本执行次数 脚本执行方式(parse|compile)\n使用示例:\n java cn.aofeng.demo.script.MultiScriptEngineCompare 100000 parse");
|
||||
System.exit(-1);
|
||||
}
|
||||
int count = Integer.parseInt(args[0]);
|
||||
String executeType = args[1];
|
||||
|
||||
String[] scriptEngineList = {"JavaScript", "JEXL"};
|
||||
|
||||
String script1 = "var c = a + b;" +
|
||||
"var d = a * b;" +
|
||||
"var e = a / b;" +
|
||||
"var f = a % b;" +
|
||||
"var g = a - b;" +
|
||||
"var result = ((a * 5) > b || b * 10 >= 100) && (a * b > 99);";
|
||||
Map<String, Object> vars1 = new HashMap<String, Object>(2);
|
||||
vars1.put("a", 20);
|
||||
vars1.put("b", 9);
|
||||
|
||||
String script2 = "var result = src.indexOf(b);";
|
||||
Map<String, Object> vars2 = new HashMap<String, Object>(2);
|
||||
vars2.put("src", "compare performance javascript and jexl");
|
||||
vars2.put("b", "script");
|
||||
|
||||
String[] scriptList = {script1, script2};
|
||||
Map[] varsList = {vars1, vars2};
|
||||
|
||||
MultiScriptEngineCompare msec = new MultiScriptEngineCompare();
|
||||
List<MultiScriptEngineCompare.ExecuteResult> resultList = new ArrayList<MultiScriptEngineCompare.ExecuteResult>();
|
||||
for (int i = 0; i < scriptEngineList.length; i++) {
|
||||
for (int j = 0; j < scriptList.length; j++) {
|
||||
if (PARSE.equalsIgnoreCase(executeType)) {
|
||||
resultList.add( msec.parse(scriptEngineList[i], scriptList[j], count, varsList[j]) );
|
||||
} else if (COMPILE.equalsIgnoreCase(executeType)) {
|
||||
resultList.add( msec.compile(scriptEngineList[i], scriptList[j], count, varsList[j]) );
|
||||
} else {
|
||||
msec.log("错误的执行方式:%s", executeType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<String[]> arrayList = new ArrayList<String[]>();
|
||||
arrayList.add(new String[]{"脚本引擎", "脚本", "脚本绑定参数", "脚本执行次数", "脚本执行类型", "消耗时间(毫秒)", "JDK版本"});
|
||||
for (Iterator iterator = resultList.iterator(); iterator.hasNext();) {
|
||||
ExecuteResult er = (ExecuteResult) iterator.next();
|
||||
arrayList.add(new String[]{er.getEngine(),
|
||||
er.getScript(),
|
||||
er.getBindParam(),
|
||||
String.valueOf(er.getExecuteCount()),
|
||||
er.getExecuteType(),
|
||||
String.valueOf(er.getUsedTime()),
|
||||
er.getJdkVersion()});
|
||||
}
|
||||
|
||||
String[][] table = new String[arrayList.size()][7];
|
||||
arrayList.toArray(table);
|
||||
|
||||
PrettyTable prettyTable = new PrettyTable(System.out);
|
||||
prettyTable.print(table);
|
||||
}
|
||||
|
||||
static class ExecuteResult {
|
||||
|
||||
private String engine;
|
||||
private String script;
|
||||
private String bindParam;
|
||||
private int executeCount;
|
||||
private String executeType;
|
||||
private long usedTime;
|
||||
private String jdkVersion;
|
||||
|
||||
public ExecuteResult() {
|
||||
this.jdkVersion = System.getProperty("java.version");
|
||||
}
|
||||
|
||||
public String getEngine() {
|
||||
return engine;
|
||||
}
|
||||
public void setEngine(String engine) {
|
||||
this.engine = engine;
|
||||
}
|
||||
public String getScript() {
|
||||
return script;
|
||||
}
|
||||
public void setScript(String script) {
|
||||
this.script = script;
|
||||
}
|
||||
public String getBindParam() {
|
||||
return bindParam;
|
||||
}
|
||||
public void setBindParam(String bindParam) {
|
||||
this.bindParam = bindParam;
|
||||
}
|
||||
public int getExecuteCount() {
|
||||
return executeCount;
|
||||
}
|
||||
public void setExecuteCount(int executeCount) {
|
||||
this.executeCount = executeCount;
|
||||
}
|
||||
public String getExecuteType() {
|
||||
return executeType;
|
||||
}
|
||||
public void setExecuteType(String executeType) {
|
||||
this.executeType = executeType;
|
||||
}
|
||||
public long getUsedTime() {
|
||||
return usedTime;
|
||||
}
|
||||
public void setUsedTime(long usedTime) {
|
||||
this.usedTime = usedTime;
|
||||
}
|
||||
public String getJdkVersion() {
|
||||
return jdkVersion;
|
||||
}
|
||||
public void setJdkVersion(String jdkVersion) {
|
||||
this.jdkVersion = jdkVersion;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
125
Java/JavaDemo/codedemo/script/PrettyTable.java
Normal file
125
Java/JavaDemo/codedemo/script/PrettyTable.java
Normal file
@@ -0,0 +1,125 @@
|
||||
package cn.aofeng.demo.script;
|
||||
|
||||
import java.io.PrintStream;
|
||||
import static java.lang.String.format;
|
||||
|
||||
/**
|
||||
* 此代码来自于网络。使用示例:
|
||||
* <pre>
|
||||
* PrettyTable printer = new PrettyTable(out);
|
||||
* printer.print(new String[][] {
|
||||
* new String[] {"FIRST NAME", "LAST NAME", "DATE OF BIRTH", "NOTES"},
|
||||
* new String[] {"Joe", "Smith", "November 2, 1972"},
|
||||
* null,
|
||||
* new String[] {"John", "Doe", "April 29, 1970", "Big Brother"},
|
||||
* new String[] {"Jack", null, null, "(yes, no last name)"}
|
||||
* });
|
||||
</pre>
|
||||
*/
|
||||
public final class PrettyTable {
|
||||
|
||||
private static final char BORDER_KNOT = '+';
|
||||
private static final char HORIZONTAL_BORDER = '-';
|
||||
private static final char VERTICAL_BORDER = '|';
|
||||
|
||||
private static final String DEFAULT_AS_NULL = "(NULL)";
|
||||
|
||||
private final PrintStream out;
|
||||
private final String asNull;
|
||||
|
||||
public PrettyTable(PrintStream out) {
|
||||
this(out, DEFAULT_AS_NULL);
|
||||
}
|
||||
|
||||
public PrettyTable(PrintStream out, String asNull) {
|
||||
if ( out == null ) {
|
||||
throw new IllegalArgumentException("No print stream provided");
|
||||
}
|
||||
if ( asNull == null ) {
|
||||
throw new IllegalArgumentException("No NULL-value placeholder provided");
|
||||
}
|
||||
this.out = out;
|
||||
this.asNull = asNull;
|
||||
}
|
||||
|
||||
public void print(String[][] table) {
|
||||
if ( table == null ) {
|
||||
throw new IllegalArgumentException("No tabular data provided");
|
||||
}
|
||||
if ( table.length == 0 ) {
|
||||
return;
|
||||
}
|
||||
final int[] widths = new int[getMaxColumns(table)];
|
||||
adjustColumnWidths(table, widths);
|
||||
printPreparedTable(table, widths, getHorizontalBorder(widths));
|
||||
}
|
||||
|
||||
private void printPreparedTable(String[][] table, int widths[], String horizontalBorder) {
|
||||
final int lineLength = horizontalBorder.length();
|
||||
out.println(horizontalBorder);
|
||||
for ( final String[] row : table ) {
|
||||
if ( row != null ) {
|
||||
out.println(getRow(row, widths, lineLength));
|
||||
out.println(horizontalBorder);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private String getRow(String[] row, int[] widths, int lineLength) {
|
||||
final StringBuilder builder = new StringBuilder(lineLength).append(VERTICAL_BORDER);
|
||||
final int maxWidths = widths.length;
|
||||
for ( int i = 0; i < maxWidths; i++ ) {
|
||||
builder.append(padRight(getCellValue(safeGet(row, i, null)), widths[i])).append(VERTICAL_BORDER);
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
private String getHorizontalBorder(int[] widths) {
|
||||
final StringBuilder builder = new StringBuilder(256);
|
||||
builder.append(BORDER_KNOT);
|
||||
for ( final int w : widths ) {
|
||||
for ( int i = 0; i < w; i++ ) {
|
||||
builder.append(HORIZONTAL_BORDER);
|
||||
}
|
||||
builder.append(BORDER_KNOT);
|
||||
}
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
private int getMaxColumns(String[][] rows) {
|
||||
int max = 0;
|
||||
for ( final String[] row : rows ) {
|
||||
if ( row != null && row.length > max ) {
|
||||
max = row.length;
|
||||
}
|
||||
}
|
||||
return max;
|
||||
}
|
||||
|
||||
private void adjustColumnWidths(String[][] rows, int[] widths) {
|
||||
for ( final String[] row : rows ) {
|
||||
if ( row != null ) {
|
||||
for ( int c = 0; c < widths.length; c++ ) {
|
||||
final String cv = getCellValue(safeGet(row, c, asNull));
|
||||
final int l = cv.length();
|
||||
if ( widths[c] < l ) {
|
||||
widths[c] = l;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static String padRight(String s, int n) {
|
||||
return format("%1$-" + n + "s", s);
|
||||
}
|
||||
|
||||
private static String safeGet(String[] array, int index, String defaultValue) {
|
||||
return index < array.length ? array[index] : defaultValue;
|
||||
}
|
||||
|
||||
private String getCellValue(Object value) {
|
||||
return value == null ? asNull : value.toString();
|
||||
}
|
||||
|
||||
}
|
||||
112
Java/JavaDemo/codedemo/script/ScriptRunPerformence.java
Normal file
112
Java/JavaDemo/codedemo/script/ScriptRunPerformence.java
Normal file
@@ -0,0 +1,112 @@
|
||||
package cn.aofeng.demo.script;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.script.Bindings;
|
||||
import javax.script.Compilable;
|
||||
import javax.script.CompiledScript;
|
||||
import javax.script.ScriptEngine;
|
||||
import javax.script.ScriptEngineManager;
|
||||
import javax.script.ScriptException;
|
||||
|
||||
/**
|
||||
* 脚本语言运行性能测试:
|
||||
* <pre>
|
||||
* 1、每次运行脚本都解释的执行性能。
|
||||
* 2、编译脚本后再运行的性能。
|
||||
* </pre>
|
||||
*
|
||||
* @author 聂勇 <aofengblog@163.com>
|
||||
*/
|
||||
public class ScriptRunPerformence {
|
||||
|
||||
private final static int COUNT = 100000;
|
||||
|
||||
/**
|
||||
* 每次解释脚本并运行<code>COUNT</code>次。
|
||||
*
|
||||
* @param script 脚本表达式
|
||||
* @param vars 用于替换<code>script</code>中变量的Key=>Value集合
|
||||
* @throws ScriptException 如果解释或运行脚本出错
|
||||
*/
|
||||
public void parse(String script, Map<String, Object> vars) throws ScriptException {
|
||||
ScriptEngine scriptEngine = getScriptEngine("javascript");
|
||||
long startTime = System.currentTimeMillis();
|
||||
for (int i = 0; i < COUNT; i++) {
|
||||
Bindings binds = createBinding(vars, scriptEngine);
|
||||
scriptEngine.eval(script, binds);
|
||||
}
|
||||
long usedTime = System.currentTimeMillis() - startTime;
|
||||
System.out.println( String.format("每次都解释脚本执行%d次消耗%d毫秒", COUNT, usedTime) );
|
||||
}
|
||||
|
||||
/**
|
||||
* 编译脚本后运行<code>COUNT</code>次。
|
||||
*
|
||||
* @param script 脚本表达式
|
||||
* @param vars 用于替换<code>script</code>中变量的Key=>Value集合
|
||||
* @throws ScriptException 如果编译或运行脚本出错
|
||||
*/
|
||||
public void compile(String script, Map<String, Object> vars) throws ScriptException {
|
||||
ScriptEngine scriptEngine = getScriptEngine("javascript");
|
||||
Compilable compileEngine = (Compilable) scriptEngine;
|
||||
CompiledScript compileScript = compileEngine.compile(script);
|
||||
long startTime = System.currentTimeMillis();
|
||||
for (int i = 0; i < COUNT; i++) {
|
||||
Bindings binds = createBinding(vars, scriptEngine);
|
||||
compileScript.eval(binds);
|
||||
}
|
||||
long usedTime = System.currentTimeMillis() - startTime;
|
||||
System.out.println( String.format("编译脚本后执行%d次消耗%d毫秒", COUNT, usedTime) );
|
||||
}
|
||||
|
||||
private ScriptEngine getScriptEngine(String name) {
|
||||
ScriptEngineManager sem = new ScriptEngineManager();
|
||||
return sem.getEngineByName(name);
|
||||
}
|
||||
|
||||
private Bindings createBinding(Map<String, Object> vars,
|
||||
ScriptEngine scriptEngine) {
|
||||
Bindings binds = scriptEngine.createBindings();
|
||||
if (null != vars && !vars.isEmpty()) {
|
||||
binds.putAll(vars);
|
||||
}
|
||||
|
||||
return binds;
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws ScriptException {
|
||||
if ( args.length != 1) {
|
||||
System.err.println("参数错误。使用示例:\n java cn.aofeng.demo.script.ScriptRunPerformence [parse|compile]");
|
||||
System.exit(-1);
|
||||
}
|
||||
String runType = args[0];
|
||||
if ( !"parse".equals(runType) && !"compile".equals(runType) ) {
|
||||
System.err.println("参数错误。使用示例:\n java cn.aofeng.demo.script.ScriptRunPerformence [parse|compile]");
|
||||
System.exit(-1);
|
||||
}
|
||||
|
||||
String script = "function run(a, b) {" +
|
||||
"var c = a + b;" +
|
||||
"var d = a * b;" +
|
||||
"var e = a / b;" +
|
||||
"var f = a % b;" +
|
||||
"var g = a - b;" +
|
||||
"var express = ((a * 5) > b || b * 10 >= 100) && (a * b > 99);" +
|
||||
"}" +
|
||||
"" +
|
||||
"run(x, y);";
|
||||
Map<String, Object> vars = new HashMap<String, Object>(2);
|
||||
vars.put("x", 20);
|
||||
vars.put("y", 9);
|
||||
|
||||
ScriptRunPerformence srp = new ScriptRunPerformence();
|
||||
if ("parse".equals(runType)) {
|
||||
srp.parse(script, vars);
|
||||
} else {
|
||||
srp.compile(script, vars);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
36
Java/JavaDemo/codedemo/script/SupportScriptEngine.java
Normal file
36
Java/JavaDemo/codedemo/script/SupportScriptEngine.java
Normal file
@@ -0,0 +1,36 @@
|
||||
package cn.aofeng.demo.script;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import javax.script.ScriptEngineFactory;
|
||||
import javax.script.ScriptEngineManager;
|
||||
|
||||
/**
|
||||
* 支持的脚本引擎列表。
|
||||
*
|
||||
* @author <a href="mailto:aofengblog@163.com">聂勇</a>
|
||||
*/
|
||||
public class SupportScriptEngine {
|
||||
|
||||
public void listScriptEngine() {
|
||||
ScriptEngineManager sem = new ScriptEngineManager();
|
||||
List<ScriptEngineFactory> sefList = sem.getEngineFactories();
|
||||
for (ScriptEngineFactory factory : sefList) {
|
||||
printScriptEngineInfo(factory);
|
||||
}
|
||||
}
|
||||
|
||||
private void printScriptEngineInfo(ScriptEngineFactory factory) {
|
||||
System.out.println("ScriptEngineName:" + factory.getEngineName()
|
||||
+ ", Names:" + factory.getNames()
|
||||
+ ", ScriptEngineVersion:" + factory.getEngineVersion()
|
||||
+ ", LanguageName:" + factory.getLanguageName()
|
||||
+ ", LanguageVersion:" + factory.getLanguageVersion() );
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
SupportScriptEngine msep = new SupportScriptEngine();
|
||||
msep.listScriptEngine();
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user