[资料] [链接帖] 各JavaScript引擎的简介,及相关资料/博客收集帖
RednaxelaFX
2013-04-22
先占楼留作扩展用 3
针对JavaScript对象当作密集数组使用的优化。有两个层面: 1、访问的优化 2、存储的优化 两者通常会一起实现。但也有只做了存储优化却没实现访问优化的。 另外,密集数组的优化到底在哪里做也有讲究。可以在所有JavaScript对象上都做这种优化,像V8、Nashorn、dynjs都这样;也可以只在JavaScript内建数组类型上做这种优化,例如KJS。前者的话,自己写个模拟数组的类型的运行效率会跟内建数组差不多,而后者的内建数组会比模拟数组快。 |
|
ticmy
2013-05-19
在Rhino中调用java程序,在大并发的时候非常之耗时,无压力时几毫秒能执行完的操作,压力大了需要好几秒,而直接通过java程序即使压力大依然很快,Rhino内部干了什么,让并发效率如此低下,R大有没有什么高招?
除了Rhino,和新生的Nashorn,还有没有能直接用于java的js引擎呢? |
|
RednaxelaFX
2013-05-19
喔哦,终于有人回复这帖了
ticmy 写道 在Rhino中调用java程序,在大并发的时候非常之耗时,无压力时几毫秒能执行完的操作,压力大了需要好几秒,而直接通过java程序即使压力大依然很快,Rhino内部干了什么,让并发效率如此低下,R大有没有什么高招?
既然如此那肯定是哪里锁住了…找个profiler看看锁的状况呗? 我没特别关注过这个问题所以没有现成的答案。用Rhino传参数给Java可能涉及一些转换,但我没有印象这些转换里有取锁。 ticmy 写道 除了Rhino,和新生的Nashorn,还有没有能直接用于java的js引擎呢?
还有这帖里有提到的dynjs。但这个我不看好,要用它还不如用Nashorn。唯一一个用dynjs的理由就是:它比Rhino新,而且能直接运行在JDK7上。Nashorn目前暂时还得依赖一些JDK8的特性所以暂时还不能直接运行在JDK7上。 |
|
ticmy
2013-05-20
RednaxelaFX 写道 喔哦,终于有人回复这帖了
ticmy 写道 在Rhino中调用java程序,在大并发的时候非常之耗时,无压力时几毫秒能执行完的操作,压力大了需要好几秒,而直接通过java程序即使压力大依然很快,Rhino内部干了什么,让并发效率如此低下,R大有没有什么高招?
既然如此那肯定是哪里锁住了…找个profiler看看锁的状况呗? 我没特别关注过这个问题所以没有现成的答案。用Rhino传参数给Java可能涉及一些转换,但我没有印象这些转换里有取锁。 ticmy 写道 除了Rhino,和新生的Nashorn,还有没有能直接用于java的js引擎呢?
还有这帖里有提到的dynjs。但这个我不看好,要用它还不如用Nashorn。唯一一个用dynjs的理由就是:它比Rhino新,而且能直接运行在JDK7上。Nashorn目前暂时还得依赖一些JDK8的特性所以暂时还不能直接运行在JDK7上。 环境:JDK1.6.0_26 通过ScriptEngineFactory#getParameter("THREADING")发现js引擎的是否线程安全的标识是:MULTITHREADED,但通过ScriptEngineManager#getEngineByName("js")得到的ScriptEngine对象还是不可以在多线程中共享。 经过测试发现(脚本是通过Compilable#compile编译过的),程序的将近2/3的时间花在了ScriptEngineManager#getEngineByName("js")上(多线程执行,每个线程里都执行这步操作). 写了个只做getEngineByName操作的多线程程序,发现很多下面的锁定信息: 引用 堆栈追踪:
sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:293) - 已锁定 sun.misc.Launcher$AppClassLoader@19821f java.lang.ClassLoader.loadClass(ClassLoader.java:247) sun.org.mozilla.javascript.internal.Kit.classOrNull(Kit.java:74) sun.org.mozilla.javascript.internal.NativeJavaPackage.getPkgProperty(NativeJavaPackage.java:140) - 已锁定 sun.org.mozilla.javascript.internal.NativeJavaTopPackage@77ca4c sun.org.mozilla.javascript.internal.NativeJavaPackage.get(NativeJavaPackage.java:91) sun.org.mozilla.javascript.internal.ScriptableObject.getProperty(ScriptableObject.java:1301) sun.org.mozilla.javascript.internal.ScriptRuntime.getObjectProp(ScriptRuntime.java:1326) sun.org.mozilla.javascript.internal.ScriptRuntime.getObjectProp(ScriptRuntime.java:1315) sun.org.mozilla.javascript.internal.Interpreter.interpretLoop(Interpreter.java:2804) sun.org.mozilla.javascript.internal.Interpreter.interpret(Interpreter.java:2239) sun.org.mozilla.javascript.internal.InterpretedFunction.call(InterpretedFunction.java:138) sun.org.mozilla.javascript.internal.ContextFactory.doTopCall(ContextFactory.java:323) sun.org.mozilla.javascript.internal.ScriptRuntime.doTopCall(ScriptRuntime.java:2747) sun.org.mozilla.javascript.internal.InterpretedFunction.exec(InterpretedFunction.java:149) sun.org.mozilla.javascript.internal.Context.evaluateString(Context.java:1138) com.sun.script.javascript.RhinoTopLevel.<init>(RhinoTopLevel.java:55) com.sun.script.javascript.RhinoScriptEngine.<init>(RhinoScriptEngine.java:75) com.sun.script.javascript.RhinoScriptEngineFactory.getScriptEngine(RhinoScriptEngineFactory.java:57) javax.script.ScriptEngineManager.getEngineByName(ScriptEngineManager.java:225) 而在eval的时候,也有锁定: 引用 堆栈追踪:
sun.org.mozilla.javascript.internal.NativeJavaObject.unwrap(NativeJavaObject.java:166) com.sun.script.javascript.ExternalScriptable.jsToJava(ExternalScriptable.java:435) com.sun.script.javascript.ExternalScriptable.put(ExternalScriptable.java:163) - 已锁定 javax.script.SimpleScriptContext@2fa198 - 已锁定 com.sun.script.javascript.ExternalScriptable@e7274c sun.org.mozilla.javascript.internal.ScriptableObject.putProperty(ScriptableObject.java:1385) sun.org.mozilla.javascript.internal.ScriptRuntime.setName(ScriptRuntime.java:1730) sun.org.mozilla.javascript.internal.Interpreter.interpretLoop(Interpreter.java:2788) sun.org.mozilla.javascript.internal.Interpreter.interpret(Interpreter.java:2239) sun.org.mozilla.javascript.internal.InterpretedFunction.call(InterpretedFunction.java:138) sun.org.mozilla.javascript.internal.ContextFactory.doTopCall(ContextFactory.java:323) sun.org.mozilla.javascript.internal.ScriptRuntime.doTopCall(ScriptRuntime.java:2747) sun.org.mozilla.javascript.internal.InterpretedFunction.exec(InterpretedFunction.java:149) com.sun.script.javascript.RhinoCompiledScript.eval(RhinoCompiledScript.java:37) javax.script.CompiledScript.eval(CompiledScript.java:75) |
|
RednaxelaFX
2013-05-20
多谢楼上的分析!
既然如此那请试试用JDK7。在JDK7的parallel-capable class loading功能下ClassLoader.loadClass()的锁的问题或许已经不是问题了。请试试看然后反馈过来? 至于Rhino自己的锁那个就还没啥好办法。Nashorn现在对多线程使用同一个ScriptEngine的场景也还没特别完善的支持。 |
|
ticmy
2013-05-20
RednaxelaFX 写道 多谢楼上的分析!
既然如此那请试试用JDK7。在JDK7的parallel-capable class loading功能下ClassLoader.loadClass()的锁的问题或许已经不是问题了。请试试看然后反馈过来? 至于Rhino自己的锁那个就还没啥好办法。Nashorn现在对多线程使用同一个ScriptEngine的场景也还没特别完善的支持。 用了jdk1.7,在ScriptEngineManager#getEngineByName("js")上果然没有锁争用了,对比jdk1.6,只这一句并发测试耗时降低到了一半以下。 但是加上后续的计算,jdk1.7的耗时比1.6更多一些,观察了一下jdk1.7下的锁争用,都是Rhino内部的同步造成的。 -- 随意测试了下J9 1.6,无论是获取js引擎还是加上后续计算,耗时都是远远大于hotspot1.6 |
|
RednaxelaFX
2013-05-20
有意思。多谢分析!
ticmy 写道 但是加上后续的计算,jdk1.7的耗时比1.6更多一些,观察了一下jdk1.7下的锁争用,都是Rhino内部的同步造成的。
这个的意思是在你的测试里Oracle JDK7上跑Rhino的整体性能还没有Oracle JDK6上高么? |
|
elam
2014-03-25
R大,求教对于暂时不想用JDK8的人群来说,JDK7上有什么脚本语言更适合高并发的情况?
主要是用于游戏服务器上的AI计算。 听说LuaJAVA的内部也是有锁的,无法应对高并发? |
|
RednaxelaFX
2014-03-26
elam 写道 R大,求教对于暂时不想用JDK8的人群来说,JDK7上有什么脚本语言更适合高并发的情况?
主要是用于游戏服务器上的AI计算。 听说LuaJAVA的内部也是有锁的,无法应对高并发? LuaJava看起来好老。我之前都没留意过它。 话说你们的脚本需求有多复杂?不知道比脚本语言更简单一点的实现,例如说各种表达式语言(EL)会不会够用?MVEL、Aviator之类的。 |
|
elam
2014-03-26
RednaxelaFX 写道 elam 写道 R大,求教对于暂时不想用JDK8的人群来说,JDK7上有什么脚本语言更适合高并发的情况?
主要是用于游戏服务器上的AI计算。 听说LuaJAVA的内部也是有锁的,无法应对高并发? LuaJava看起来好老。我之前都没留意过它。 话说你们的脚本需求有多复杂?不知道比脚本语言更简单一点的实现,例如说各种表达式语言(EL)会不会够用?MVEL、Aviator之类的。 谢答 主要是我希望让客户端和服务器可以共用一套代码用于战斗计算(寻路,AI,伤害计算什么的) 这样一来服务器就可以验算一些客户端行为的合法性了(不管是同步验算还是异步的验算) 所以我想来有两条路,一个是JNI,一个是脚本。 R大觉得这种需求怎么做更合适些? |
相关讨论
相关资源推荐
- 微软开源 JavaScript 引擎 ChakraCore-易语言
- 各类链接
- 《现代Javascript高级教程》JavaScript引擎的垃圾回收机制
- 深入了解JavaScript引擎精华,让你的代码执行更高效
- php js解析引擎,拿下JavaScript引擎的基本原理
- understand-js-runtimes:有关Java引擎的不同最新资源列表
- JS引擎(1):JS引擎擂台赛,JavaScript引擎的特征比较及术语科普
- V8 javascript 引擎
- JS引擎(0):JavaScript引擎群雄演义—起底JavaScript引擎
- JavaScript 引擎基本原理:Shapes 和 Inline Caches