`

jdk 1.6 新特性,集成Groovy, 性能很差

    博客分类:
  • JDK
 
阅读更多
性能都是相对的,如果调用量不是很大的话,可以忽略,毕竟使用为主。groovy支持的语法还是很多的,灰常推荐,我这只是小实验罢了

代码执行如下:
	/**
	 * @param args
	 * @throws ScriptException 
	 */
	public static void main(String[] args) throws ScriptException {
		// TODO Auto-generated method stub
		ScriptEngineManager sem = new ScriptEngineManager();
		//sem.registerEngineName("frame", new FrameScriptEngineFactory());
		ScriptEngine engine = sem.getEngineByName("groovy");
		Bindings bindings = engine.getBindings(ScriptContext.ENGINE_SCOPE);
		bindings.put("tag", new TagImpl());
		bindings.put("bcontext", new BContext(9));
		bindings.put("account", 9);
		long s = System.currentTimeMillis();
		for(int i=0;i<10000;i++){
			Object result = engine.eval("tag.hasTag(account)");
			Object result1 = engine.eval("tag.hasTag(account)");
			Object result2 = engine.eval("tag.isManager(bcontext)"); 
		}
		System.out.println(System.currentTimeMillis()-s);
		//No cache 234 203 187
		//cache 125 141 141 125
		//groovy 2375 1796 1719
	}



这是我测试的结果,使用反射与使用groovy的差距。
其实反射没有大家想像的这么慢, 反射缓存Method后,性能可以提升差不多2倍.

这个测试我实现了自己的ScriptEngineFactory,并使用jdk的反射机制与Groovy进行对比。
package org.miniframe.modules.script;

import javax.script.ScriptEngine;

/** 
 *  this is a factory to product ScriptEngine.
 */
public class FrameScriptEngineFactory extends AbstractScriptEngineFactory {

	@Override
	public String getEngineName() {
		return "frame";
	}

	@Override
	public String getEngineVersion() {
		return "1.0";
	}
 
	@Override
	public ScriptEngine getScriptEngine() { 
		FrameScriptEngine framese = new FrameScriptEngine(this); 
		return framese;
	}

}



package org.miniframe.modules.script;

import java.io.Reader;

import javax.script.AbstractScriptEngine;
import javax.script.Bindings;
import javax.script.ScriptContext;
import javax.script.ScriptEngineFactory;
import javax.script.ScriptException;

public class FrameScriptEngine extends AbstractScriptEngine{
	
	private FrameScriptEngineFactory framesef;
	
	public FrameScriptEngine(FrameScriptEngineFactory framesef){
		super();
		this.framesef=framesef; 
	} 
	
	@Override
	public ScriptEngineFactory getFactory() { 
		return framesef;
	}


	/**
	 * 
	 * 1. first compile script to compileScript
	 * 2. execute compoleScript to get result.
	 */
	@Override
	public Object eval(String script, ScriptContext context)
			throws ScriptException {
		FrameCompilable compiled = new FrameCompilable();
		FrameCompiledScript compiledScript = (FrameCompiledScript) compiled.compile(script);
		return compiledScript.eval(context);
	}



	@Override
	public Object eval(Reader reader, ScriptContext context)
			throws ScriptException {
		// TODO Auto-generated method stub
		return null;
	}



	@Override
	public Bindings createBindings() {
		// TODO Auto-generated method stub
		return null;
	}

}



package org.miniframe.modules.script;

import java.io.Reader;
import java.util.HashMap;
import java.util.Map;

import javax.script.Compilable;
import javax.script.CompiledScript;
import javax.script.ScriptException;

public class FrameCompilable implements Compilable {
	
	private Map<String,CompiledScript> compiledCache = new HashMap<String,CompiledScript>();

	@Override
	public CompiledScript compile(String script) throws ScriptException {
		CompiledScript compiledScript = compiledCache.get(script);
		if(compiledScript!=null){
			return compiledScript;
		}else{
			FrameCompiledScript frameScript = new FrameCompiledScript();
			frameScript.compile(script); 
			compiledCache.put(script, frameScript);
			compiledScript = frameScript;
		}
		return compiledScript;
	}

	@Override
	public CompiledScript compile(Reader script) throws ScriptException {
		// TODO Auto-generated method stub
		return null;
	}

}



package org.miniframe.modules.script;

import javax.script.Bindings;
import javax.script.CompiledScript;
import javax.script.ScriptContext;
import javax.script.ScriptEngine;
import javax.script.ScriptException;

public class FrameCompiledScript extends CompiledScript {
	  
	private String script;
	private String target;
	private String method;
	private String[] args;
	 
	public String getTarget() {
		return target;
	}

	public void setTarget(String target) {
		this.target = target;
	}

	public String getMethod() {
		return method;
	}

	public void setMethod(String method) {
		this.method = method;
	}

	public String[] getArgs() {
		return args;
	}

	public void setArgs(String[] args) {
		this.args = args;
	}
	
	public void compile(String script){
		this.script=script;
		String[] fs = script.split("\\.");
		if(fs.length==2){
			String target = fs[0];
			String[] ss = fs[1].split("\\(");
			String method = ss[0];
			String[] args = ss[1].substring(0, ss[1].length()-1).split(",");
			setTarget(target);
			setMethod(method); 
			setArgs(args);
		}
	}

	@Override
	public Object eval(ScriptContext context) throws ScriptException {
		FrameInvocable invocable = new FrameInvocable(script);
		Bindings binding = context.getBindings(ScriptContext.ENGINE_SCOPE);
		Object[] objargs = new Object[args.length];
		for(int i=0;i<args.length;i++){
			Object objarg = binding.get(args[i]);
			objargs[i]=objarg;
		} 
		Object obj = null;
		try {
			obj = invocable.invokeMethod(binding.get(target), method, objargs);
		} catch (NoSuchMethodException e) {  
		}
		return obj;
	}

	@Override
	public ScriptEngine getEngine() {
		// TODO Auto-generated method stub
		return null;
	}

}



package org.miniframe.modules.script;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.Map;

import javax.script.Invocable;
import javax.script.ScriptException;

public class FrameInvocable implements Invocable {

	private static Map<String, Method> methodCache = new HashMap<String, Method>();
	
	private boolean flag = true;

	private String script;

	public FrameInvocable(String script) {
		this.script = script;
	}
 
	@SuppressWarnings("rawtypes")
	@Override
	public Object invokeMethod(Object thiz, String name, Object... args)
			throws ScriptException, NoSuchMethodException {
		Method method = methodCache.get(script);
		Object re = null;
		if (method != null) {
			re = invoke(thiz, method, args);
		} else {
			Class[] parameterTypes = new Class[args.length];
			for (int i = 0; i < args.length; i++) {
				parameterTypes[i] = args[i].getClass();
			}
			method = getMethod(thiz, name, parameterTypes);
			if(flag){
				methodCache.put(script, method);
			}
			re = invoke(thiz, method, args);
		}

		return re;
	}

	/**
	 * search method from me and parents
	 * 
	 * @param target
	 * @param methodName
	 * @param args
	 * @return
	 */
	public static Method getMethod(Object target, String methodName,
			Class<?>... args) {
		Method method = null;
		try {
			for (Class<?> searchType = target.getClass(); searchType != Object.class; searchType = searchType
					.getSuperclass()) {
				method = searchType.getDeclaredMethod(methodName, args);
				if (method != null) {
					return method;
				}
			}
		} catch (SecurityException e) {
			throw e;
		} catch (NoSuchMethodException e) {
			throw new IllegalArgumentException("invalid:no method ["
					+ methodName + "] on target [" + target + "]", e);
		}
		return method;

	}

	/**
	 * invoke method
	 * 
	 * @param target
	 * @param method
	 * @param args
	 * @return
	 * @throws Throwable
	 */
	public static Object invoke(Object target, Method method, Object[] args) {
		try {
			if (!Modifier.isPublic(method.getModifiers())
					|| !Modifier.isPublic(method.getDeclaringClass()
							.getModifiers())) {
				method.setAccessible(true);
			}
			return method.invoke(target, args);
		} catch (InvocationTargetException ex) {
			throw new IllegalArgumentException(ex);
		} catch (IllegalArgumentException ex) {
			throw new IllegalArgumentException(
					"invalid: tried calling method [" + method
							+ "] on target [" + target + "]", ex);
		} catch (IllegalAccessException ex) {
			throw new IllegalArgumentException("Could not access method ["
					+ method + "]", ex);
		}
	}

	@Override
	public Object invokeFunction(String name, Object... args)
			throws ScriptException, NoSuchMethodException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public <T> T getInterface(Class<T> clasz) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public <T> T getInterface(Object thiz, Class<T> clasz) {
		// TODO Auto-generated method stub
		return null;
	}

}

分享到:
评论

相关推荐

    jdk1.6集成jjwt的问题

    标题中的“jdk1.6集成jjwt的问题”指的是在Java Development Kit (JDK) 版本1.6的环境下,尝试整合JSON Web Token (JWT) 库jjwt时遇到的挑战。JWT是一种开放标准(RFC 7519),用于在各方之间安全地传输信息作为 ...

    苹果电脑安装jdk1.6 mac for jdk1.6 jdk6 安装版

    mac for jdk1.6 jdk6 安装版 里面有两个jdk1.6的安装包,都可以用 如果电脑上安装有1.7,1.8等高版本jdk就不要再下安装包了,安装包安装会报错 命令是这个:brew install java6或 brew install homebrew/cask-...

    JDK1.6版本下载

    这个版本在Java社区中具有广泛的影响力,因为它引入了许多新特性和性能优化,使得开发者能够更高效地编写和运行Java程序。 首先,JDK 1.6包含JRE(Java Runtime Environment),它是运行Java应用程序所必需的环境。...

    JDK1.6新特性搜集整理

    通过这些新特性,JDK1.6为开发者提供了更强大的工具集,提升了开发效率,同时也优化了应用程序的性能和可管理性。理解并掌握这些特性,对于深入理解Java技术和开发高质量的Java应用具有重要的意义。

    JDK1.6的九大新特性

    ### JDK1.6的九大新特性详解 #### 一、Desktop类和SystemTray类 在JDK1.6中,AWT库新增了两个重要的类:`Desktop`和`SystemTray`。 - **Desktop类**:此类提供了一系列静态方法用于执行常见的桌面操作,如打开...

    jdk1.6压缩包,下载即用

    - **下载**:从Oracle官网或其他可信源下载JDK 1.6的安装文件,如"jdk1.6.exe"。 - **安装**:双击执行安装文件,按照向导步骤进行安装,选择合适的安装路径。 - **环境变量设置**:安装完成后,需要在系统环境变量...

    okhttp3.8源码使用jdk1.6重新编译_okhttp3.8.0-jdk1.6.zip

    1.okhttp3.8源码使用jdk1.6重新编译,已集成了okio,在javaweb项目中使用,未在安卓项目中使用 2.okhttp3.8源码使用jdk1.6重新编译_okhttp3.8.0-jdk1.6.jar

    aspose-words-15.8.0-jdk1.6

    aspose-words-15.8.0-jdk1.6aspose-words-15.8.0-jdk1.6aspose-words-15.8.0-jdk1.6aspose-words-15.8.0-jdk1.6aspose-words-15.8.0-jdk1.6aspose-words-15.8.0-jdk1.6aspose-words-15.8.0-jdk1.6aspose-words-...

    jdk1.6免安装版

    JDK1.6是Oracle公司发布的一个早期版本,虽然现在已有更新的版本如JDK 8、11或17,但有些老旧的项目可能仍依赖于这个版本。本文将深入探讨JDK1.6的特点、用途以及免安装版的优缺点。 首先,JDK1.6包含了Java编译器...

    JDK1.6百度云下载

    1. **性能优化**:JDK1.6对垃圾回收机制进行了改进,提升了程序运行时的性能;同时,对线程管理也做了优化,提高了多线程程序的执行效率。 2. **新API**:引入了一些新的API,如`java.nio`包中的新类`FileChannel`等...

    jdk1.6 解压版-windows

    JDK1.6相对于更早的版本,引入了一些新特性,如: - **泛型的改进**:增加了类型推断,使得泛型的使用更加方便。 - **并发工具的增强**:如ConcurrentHashMap、Fork/Join框架等,提升了多线程编程的效率和可维护性...

    jdk1.6jar包

    1. **改进的性能**:JDK 1.6通过优化JVM和类加载机制,提升了运行时的性能,尤其是对于大规模应用和并发处理。 2. **增强的内存管理**:包括更高效的垃圾回收机制,如并行垃圾回收和CMS(Concurrent Mark Sweep)...

    jdk1.6 32位免安装纯绿色版

    这个版本在2006年发布,引入了许多新特性、增强功能以及性能优化,以提升开发者的效率和应用程序的性能。对于32位操作系统,它是专为那些运行在32位处理器架构上的系统设计的,比如Windows XP、Windows Vista或早期...

    jdk1.6与eclipse集成

    在IT行业中,集成开发环境(IDE)的选择对程序员...值得注意的是,随着技术的发展,JDK的更新版本,如JDK 8、11等,通常会包含更多的新特性和性能优化,因此在实际开发中,根据项目需求选择合适的JDK版本也是很重要的。

    okhttp3.8.0-jdk1.6.zip

    《OkHttp3.8.0-JDK1.6:低版本环境下的高效网络通信库》 OkHttp3.8.0-jdk1.6.zip是一个专门为Java Web项目设计的网络通信库,它针对JDK1.6进行了优化和重新编译,确保在较低版本的Java环境中也能稳定运行。OkHttp,...

    jdk 1.6 64位

    8. **国际化和本地化**:JDK 1.6在处理全球化和本地化方面做了很多改进,支持更多的语言和地区设置。 9. **Java Web Start和Applet的增强**:提高了Java Web Start应用程序和Applet的启动速度,同时增强了安全性和...

    jdk1.6解压版(免安装版)

    它在2006年发布,引入了许多新特性,包括改进的垃圾回收算法、更好的性能优化、增强的Swing组件、新的XML处理API(如JAXB 2.0)以及对JavaScript的支持(通过 Rhino 引擎)。对于开发者来说,JDK1.6提供了一个稳定的...

    IBMJDK1.6linux.zip

    IBM JDK与Oracle的JDK相比,提供了许多特定的性能优化和特性,尤其在服务器端计算环境中。 IBM JDK 1.6的主要组成部分包括: 1. **Java虚拟机(JVM)**:这是Java程序运行的基础,负责解释和执行字节码。IBM的JVM...

    JDK1.6新特性说明.doc

    JDK1.6新特性说明.doc

Global site tag (gtag.js) - Google Analytics