Phy*_*win 15 java performance jvm daemon startup
据说Java在性能方面比python快10倍.这也是我从基准测试中看到的.但真正降低Java的是JVM启动时间.
这是我做的一个测试:
$time xlsx2csv.py Types\ of\ ESI\ v2.doc-emb-Package-9
...
<output skipped>
real 0m0.085s
user 0m0.072s
sys 0m0.013s
$time java -jar -client /usr/local/bin/tika-app-0.7.jar -m Types\ of\ ESI\ v2.doc-emb-Package-9
real 0m2.055s
user 0m2.433s
sys 0m0.078s
Run Code Online (Sandbox Code Playgroud)
同样的文件,Docx和Python中的12 KB ms XLSX嵌入文件快25倍!WTH!
Java需要2.055秒.
我知道这完全是由于启动时间,但我需要的是我需要通过脚本调用它来解析一些我不想在python中重新发明轮子的文件.
但是,为了解析10k +文件,它只是不实用..
无论如何要加快它(我已经尝试过-client选项,它只加速这么少(20%)).
我的另一个想法?将其作为长时运行的守护进程运行,在本地使用UDP或Linux-ICP套接字进行通信?
刚学会了今天的滴水,作为nailgun的另一个替代品:https://github.com/flatland/drip 另请参阅此页面了解一些一般性提示:另请参阅https://github.com/jruby/jruby/wiki/Improving -启动时间
我建议您参阅 Matthew Gilliard (mjg)的关于该主题的博客文章。下面的任何代码示例都直接来自那里。我不会包括计时示例,部分是为了保持简短,部分是为了吸引您访问他的页面。Matthew 在Fn 项目中工作,因此他对弄清楚如何将启动时间保持在较低水平非常感兴趣。
显然有几种方法可以做到,有些方法也很简单。核心思想是缓存 JVM 的初始化周期,而不是在每次启动时都执行它。
CDS 缓存 JDK 的确定性(硬件相关)启动过程。这是书中最简单和最古老的(我相信从 1.5 开始)技巧(并且不是很出名)。
来自甲骨文
当 JVM 启动时,共享存档是内存映射的,以允许在多个 JVM 进程之间共享这些类的只读 JVM 元数据。启动时间减少,从而节省成本,因为恢复共享存档比加载类更快。
您可以通过运行手动创建转储
? java -Xshare:dump
Allocated shared space: 50577408 bytes at 0x0000000800000000
Loading classes to share ...
// ...snip ...
total : 17538717 [100.0% of total] out of 46272512 bytes [ 37.9% used]
Run Code Online (Sandbox Code Playgroud)
...然后使用它
java -Xshare:on HelloJava
Run Code Online (Sandbox Code Playgroud)
来自 mjg 的博客
CDS 提前完成了部分核心类的类加载,而 AOT 实际上是提前将字节码编译为本机代码(ELF 格式的共享对象文件),并且可以应用于任何字节码。
不是在博客文章中,而是在他几天前的演讲中展示的。
从自述文件:
Substrate VM 是一个框架,它允许在封闭世界假设下将 Java 应用程序提前 (AOT) 编译为可执行映像或共享对象(ELF-64 或 64 位 Mach-O)。