首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java/C++性能

Java/C++性能
EN

Stack Overflow用户
提问于 2011-05-24 03:17:19
回答 5查看 720关注 0票数 0

大家好,我已经开始学习Java了,我听说它很慢。为了做一个实验,我用C++和Java写了两个程序,它们看起来是一样的

代码语言:javascript
复制
import java.util.*;

class Java {
  public static void main(String args[]) {
    long beg = System.currentTimeMillis();
    for (int i = 0; i < 200000000; ++i) { }
    long end = System.currentTimeMillis();
    System.out.println(end - beg);
  }
}

输出334

代码语言:javascript
复制
#include <cstdio>
#include <ctime>

int main() {
      double beg = clock();
      for (int i = 0; i < 200000000; ++i) { }
      double end = clock();
      printf("%f\n", (end - beg) / double(CLOCKS_PER_SEC) / 1000.0);
      return 0;
}

输出0.000810

我有点困惑。Java真的那么慢吗?还是我做错了什么?

EN

回答 5

Stack Overflow用户

发布于 2011-05-24 03:20:06

你不能像这样对编程语言进行微基准测试。

有数以千计的因素在起作用。请记住,例如,Java程序在虚拟机中运行,需要一些时间才能启动。

一些基准测试会告诉你C++更快,其他的则相反。这真的归结于基准测试的作用。在谷歌上搜索java c++基准测试,你会发现这两种情况都有很多。

现代即时编译器可以做任何C++编译器都能做的大多数优化,因此对于纯粹的数字处理算法,它们具有相似的性能数字。

票数 5
EN

Stack Overflow用户

发布于 2011-05-24 04:46:46

首先,你想做的事情可能是毫无意义的。尽管有一些相似之处,但(至少在我的经验中) C++和Java之间的性能差异很少。

如果您坚持要这样做,那么您的代码需要大量的工作才能生成准确地表示某些内容的结果,即使准确的结果可能没有任何意义。我会写这样的C++版本:

代码语言:javascript
复制
#include <iostream>
#include <ctime>

int main() {
    unsigned value = 0;
    static const int loops = 200000000;
    static const double nano_factor = 1e9;

    clock_t beg = std::clock();
    for (int i=0; i<loops; ++i)
        value += i;
    clock_t end = std::clock();

    std::cout << "Ignore: " << value << "\n";
    std::cout << (((end - beg) / double(CLOCKS_PER_SEC)) / loops) * nano_factor 
              << " nanoseconds/iteration";
    return 0;
}

这在循环中做了一些事情(尽管它仍然很微不足道),计算出一个我怀疑大多数编译器在编译时是否能计算出的结果。然后打印出来,所以至少有很高的概率循环将实际执行。

除此之外,我相信我已经修复了计时代码,所以它产生的结果至少与现实有关。

我将把Java版本的重写留给其他人,但是虽然它不需要那么多的工作,但它仍然需要一些相同的工作,然后它的结果才会真正与任何东西有很大关系。

票数 3
EN

Stack Overflow用户

发布于 2011-05-24 03:21:17

你做错了什么。

如果C++编译器什么也不做,它就足够聪明,可以优化你的循环。实际上,一个好的JVM (试着使用java -server)也可以做到这一点。;-)

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

https://stackoverflow.com/questions/6101827

复制
相关文章

相似问题

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