首页
学习
活动
专区
圈层
工具
发布

Java与GCJ
EN

Stack Overflow用户
提问于 2010-06-13 15:18:55
回答 6查看 25.7K关注 0票数 23

我有一个用Java编写的速度测试的结果:

代码语言:javascript
复制
Java

real        0m20.626s
user        0m20.257s
sys         0m0.244s

GCJ

real        3m10.567s
user        3m5.168s
sys         0m0.676s

那么,GCJ的目的是什么呢?有了这个结果,我相信我不会用GCJ编译它!

我在Linux上测试过这个,在Windows中的结果可能比这更好吗?

这是应用程序的代码:

代码语言:javascript
复制
public static void main(String[] args) {
    String str = "";
    System.out.println("Start!!!");
    for (long i = 0; i < 5000000L; i++) {
        Math.sqrt((double) i);
        Math.pow((double) i, 2.56);
        long j = i * 745L;
        String string = new String(String.valueOf(i));
        string = string.concat(" kaka pipi"); // "Kaka pipi" is a kind of childly call in Dutch. 
        string = new String(string.toUpperCase());
        if (i % 300 == 0) {
            str = "";
        } else {
            str += Long.toHexString(i);
        }
    }
    System.out.println("Stop!!!");
}

我用GCJ编译成这样:

代码语言:javascript
复制
gcj -c -g -O Main.java
gcj --main=speedtest.Main -o Exec Main.o

然后像这样跑了:

代码语言:javascript
复制
time ./Exec                     // For GCJ
time java -jar SpeedTest.jar    // For Java
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-06-13 15:25:21

GCJ已经过时了。它很久以前就开始了,因为人们想要一个替代Sun的开源替代方案,而且它从来都不是特别好。现在Sun开源了他们的JDK,完全没有理由使用GCJ (但它仍然潜伏在一些Linux发行版中)。

票数 36
EN

Stack Overflow用户

发布于 2010-06-14 15:37:34

这是一个不公平的比较,当你做AOT (提前)编译很少优化(-O)。至少试试-O2吧。

在单一的人为测试中,它也不像一个比另一个更简单。AOT编译在某些情况下效果最好。JVM在其他方面工作得更好,它也在很大程度上取决于JVM的质量。在现实世界中,ecj在编译OpenJDK时比在JVM上运行要快得多。对于长期运行的应用程序来说,JVM很可能获胜,因为它可以利用不可能提前实现的动态优化。ecj受到了影响,因为它编译的时间很短,JVM仍然在解释代码。当HotSpot确定它是值得的(“热点”)时,它会编译和优化它。

顺便说一句,FAQ已经过时了。GCJ支持1.5的大部分,当然足以构建OpenJDK。如果没有GCJ仍然“潜伏在某些Linux发行版中”,就不可能从一开始就构建OpenJDK。

票数 14
EN

Stack Overflow用户

发布于 2011-02-24 14:23:15

在x86和AMD64上,Hotspot只对浮点使用SSE,但我看到在x86上,gcj似乎不支持SSE,并且使用了更慢的387条指令:

代码语言:javascript
复制
gcj -O3 -mfpmath=sse --main=Bench Bench.java -o Bench
jc1: warning: SSE instruction set disabled, using 387 arithmetics
/tmp/ccRyR50H.i:1: warning: SSE instruction set disabled, using 387 arithmetics

所以这可以解释速度的差异。

请注意,当GCC确实使用SSE时,它在浮点上的性能大大优于Hotspot,因为GCC生成SIMD指令,Hotspot只使用未打包的SSE算法。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3032727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档