我正在努力更好地理解这种差异.我在网上找到了很多解释,但它们倾向于抽象的差异而不是实际的含义.
我的大部分编程经验都是CPython(动态,解释)和Java(静态,编译).但是,据我所知,还有其他类型的解释和编译语言.除了可执行文件可以从编译语言编写的程序中分发之外,每种类型都有任何优点/缺点吗?通常,我听到有人认为解释性语言可以交互使用,但我相信编译语言也可以有交互式实现,对吗?
python java compiler-construction interpreter programming-languages
与CPython等其他运行时相比,究竟是什么让JVM(特别是Sun的实现)运行缓慢?我的印象是,无论是否需要,它主要与一大堆图书馆的装载有关,但这似乎不需要花费10年的时间来修复.
想想看,JVM的启动时间与Windows上的CLR相比如何?Mono的CLR怎么样?
更新:我特别关注Unix中常见的小型实用程序的用例.Java现在适合这种风格吗?无论Java发生什么样的启动开销,它是否会为每个Java进程加起来,或者开销只是真正体现在第一个进程中?
我在Clojure中编写了一些小的实用程序应用程序,我使用Maven和maven-shade-plugin编译成自包含的可执行JAR文件("uberjars").这些uberjars包含clojure.jar的解压缩版本以及应用程序所依赖的其他库(即:commons-cli).它们很方便,因为我可以将它们发送给客户而无需客户安装Clojure(所有客户都已经安装了JRE).
我发现Clojure应用程序需要几秒钟才能启动,而用Java编写的类似应用程序在相同的机器上以秒为单位启动(例如,显示使用消息的时间).
我怀疑这是因为Clojure正在编译clojure.core库中的一些代码,因为clojure.jar .clj文件中有源代码(文件).
有没有办法预编译这个源代码?可以采取其他措施来加速启动性能吗?我听到客户抱怨启动需要多长时间(他们不知道或不关心应用程序是用Clojure,Java还是Foobar编写的).
据说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套接字进行通信?
我正在创建一个Java应用程序,它将进行一些处理,然后需要显示一条消息以向用户提供反馈.
然而,它似乎非常缓慢 - 需要两秒钟才能返回.
我把源代码剥离到明显的罪魁祸首,这里是使用的代码:
package SwingPlay;
import javax.swing.JFrame;
public class Dialog
{
public static void main( String[] args )
{
JFrame frame = new JFrame( "DialogDemo" );
}
}
Run Code Online (Sandbox Code Playgroud)
我正在从命令行执行此操作:
java -classpath . SwingPlay.Dialog
Run Code Online (Sandbox Code Playgroud)
正如你所看到的 - 我什么也没做,只是创建了一个JFrame,甚至没有显示它.
如果它是相关的,这是我的java -version输出:
java version "1.6.0_11"
Java(TM) SE Runtime Environment (build 1.6.0_11-b03)
Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing)
Run Code Online (Sandbox Code Playgroud)
这是(目前)针对Win XP SP2运行.
所以,第一个问题:为什么这么慢?
更重要的是,我只想要一个简单的消息(GUI,而不是cmdline)毫不拖延地显示 - 任何人都可以提供一些代码来执行此操作吗?
更新:
一些背景可能会有所帮助:
我正在创建一个具有许多"头"的应用程序(即不同的用户界面都使用相同的核心类来完成复杂的部分).
我目前有一个纯粹的命令行头,工作正常 - 直接响应.
我还将有一个带有常规点击式GUI的标准应用程序,并且不会预见到这个问题.
我目前正在研究的是这两者的混合 - 它将从运行框(或类似的启动器)启动,可能带有参数,并且只需要有效地响应状态消息,可以通过按键.
后一个是问题集中的地方.
虽然我并不反对将现有的命令行版本与shell脚本一起使用(虽然不认为这是必要的!),现有的答案似乎表明事情对我来说并不像对别人那样快 - …
$ time java -jar clojure-1.4.0.jar -e '(println "Hello world")'
Hello world
real 0m4.586s
$ time python clojure.py -c '(py/print "Hello world")'
real 0m14.690s
$ time mono Clojure.Main.exe -e '(println "hello world")'
hello world
real 0m4.843s
/* clojure-metal is not tested due to not being written at the moment */
Run Code Online (Sandbox Code Playgroud)
Clojure启动时间可以很小,就像我运行Perl或Python脚本一样吗?慢启动时间是基础框架或Clojure的问题(可以迟早修复)还是设计?
注意:我已经了解了start-persistent-server-than-connect-to-it的解决方法.