Java内容重新整理删除过期的东西

This commit is contained in:
estom
2025-09-14 03:49:42 -04:00
parent 9b8524ff80
commit 885b795e45
413 changed files with 643 additions and 1340 deletions

View 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;
}
}
}

View 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();
}
}

View 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);
}
}
}

View 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();
}
}