[资料] [链接帖] 各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)会不会够用?MVELAviator之类的。
elam 2014-03-26
RednaxelaFX 写道
elam 写道
R大,求教对于暂时不想用JDK8的人群来说,JDK7上有什么脚本语言更适合高并发的情况?
主要是用于游戏服务器上的AI计算。
听说LuaJAVA的内部也是有锁的,无法应对高并发?

LuaJava看起来好老。我之前都没留意过它。
话说你们的脚本需求有多复杂?不知道比脚本语言更简单一点的实现,例如说各种表达式语言(EL)会不会够用?MVELAviator之类的。


谢答
主要是我希望让客户端和服务器可以共用一套代码用于战斗计算(寻路,AI,伤害计算什么的)
这样一来服务器就可以验算一些客户端行为的合法性了(不管是同步验算还是异步的验算)
所以我想来有两条路,一个是JNI,一个是脚本。
R大觉得这种需求怎么做更合适些?
Global site tag (gtag.js) - Google Analytics