我正在开发一个.NET网站,以便在Parallel Plesk Panel(Windows)上托管,我有一些用Java编写的类,我想在我的网站上使用它的swing和JavaMail API。 我有两个选择 - jni4net和IKVM.net。只想知道在性能和开发工作方面哪一个是高效便捷的方法?
答案 0 :(得分:6)
jni4net 方式更小(1.5MB二进制大小),并且具有更好的占用空间 - 但开发可能会停止,项目已被放弃,因为上次存储库更新已执行在2013年11月,它仍然处于Alpha阶段,因此不成熟,复杂,需要做更多的工作才能使用它,BTW, jni4net正在使用LGPL ,如果你想在你的商业产品中使用它,那将是一个非常大的问题。
IKVM.net,AFAIK,是一个几乎完全实现的在CLR中编码的Java Runtime(因为它实现了OpenJDK,而不是Orcale Java,因此它有点破碎)平台,以及它自身将 JIT将Java字节码编译成IL ,然后执行它,这类似于QEMU,但还有另一个问题,我们遇到了三层,第一层是 Java Runtime ,然后我们来到 CLR ,最后是原生代码,因此非常非常慢,另一个问题是初始时间问题。
例如,我编写了一个Java程序,只打印着名的“Hello World”引用然后退出,然后我想测试一下IKVM.net和Orcale JVM(缩短到JVM)多少毫秒)可以这样做(我在KVM windows环境中运行两个平台,配备2个通用3.4 GHz CPU和2G DDR3内存),我的结果是, JVM在692ms内完成,内存使用量为9MB ,而 IKVM.net,可以使用大约4923毫秒,内存占用19MB 来打印一个很酷的“Hello World!”仅报价! 如果我将Java类编译为预编译的IL(ikvmc),可以将时间减少到大约1907ms,内存使用量与JIT相同。
相比之下,对于JVM和IKVM.net(JIT), JVM已经引发了大约7倍的时间和2倍的内存对抗竞争对手,以及JVM和IKVM.net(之前)编译), JVM仍然领先于对手的2.7倍和1.11倍的内存,而对于IKVM.net(JIT)和IKVM.net(预编译),它将可以提高您的时间,并且内存占用没有差异,但它们仍然比JVM 更慢更胖。
另外还有一个问题,预编译的IKVM.net存根必须随处携带整个IKVM.net二进制文件,然后包大小增加约41MB,我不知道我知道是否可以剥离一些未使用的库,但在大多数情况下,我们不会这样做。
对于jni4net,用于打印“Hello World”的时间是约1567ms ,从CLR到JVM,从JVM到CLR呢?有点奇怪,它使用 2106ms ,我不知道为什么差别很大,也许是因为 Java正在从头开始创建一个CLR实例,而< strong> CLR可以直接P / Invoke JNI静态。
总而言之,jni4net更可能是CLR和JVM之间的代理 - 它不是实现完整的Java环境,也不是模拟完整的CLR,而是会创建JVM和CLR实例由现有资源。虽然IKVM.net,它更像是伪装成.Net编码的 JVM,但你可以将Java代码注入CLR,而你不能在Java端编写.Net ,它很慢,但它不再需要JVM ,你可以安装.Net Framework并享受其余的(但你只能运行Java SE)。
为了回答你的问题,根本没有好的解决方案 - jni4net和IKVM.net,实际上两个完全不同的东西,但如果你想强制结论,我我想使用IKVM.net - 它仍然活跃,强大,可扩展,但胖和慢。