Java/C++;表演

Java/C++;表演,java,c++,Java,C++,大家好 我已经开始学习Java,并且听说它的速度很慢。在实验中,我用C++和java编写了两个程序,它们看起来相等: 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.cu

大家好 我已经开始学习Java,并且听说它的速度很慢。在实验中,我用C++和java编写了两个程序,它们看起来相等:

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);
  }
}
import java.util.*;
Java类{
公共静态void main(字符串参数[]){
long beg=System.currentTimeMillis();
对于(int i=0;i<200000000;++i){}
long end=System.currentTimeMillis();
System.out.println(end-beg);
}
}
产出334

#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;
}
#包括
#包括
int main(){
双beg=时钟();
对于(int i=0;i<200000000;++i){}
双端=时钟();
printf(“%f\n”,(end-beg)/double(时钟每秒)/1000.0);
返回0;
}
产出0.000810


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

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

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

一些基准会告诉你C++更快,其他人会说相反。这实际上可以归结为基准测试的功能。谷歌为java C++基准测试,你会发现这两种类型都有很多。
<>现代JIT编译器可以完成任何C++编译器所能做的优化,因此对于纯数字压缩算法,它们的性能曲线是相似的。

< P>最大的时间是C++,这可能是因为事实上,空循环被编译器完全地优化了。

< P>你做了一些错误。
C++编译器足够聪明,可以优化循环输出(如果它不起作用的话)。实际上,一个好的JVM(尝试使用
java-server
)也可以做到这一点

所以,我猜一下,你的基准是错的。我认为应该是:

printf("%f\n", ((end - beg) * 1000.0) / double(CLOCKS_PER_SEC));

首先,你想做的可能是毫无意义的。尽管有一些相似之处,但至少有一些经验表明,C++和java之间的性能差异是很小的。 如果您坚持要这样做,那么您的代码需要做大量的工作来生成准确表示某个内容的结果,即使准确的结果可能毫无意义。我会写C++版本的类似的东西:

#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;
}
#包括
#包括
int main(){
无符号值=0;
静态常量int循环=200000000;
静态常数双纳米系数=1e9;
clock_t beg=std::clock();

对于(int i=0),你的第二个程序不是真正的C++程序,而是一个C程序。你在循环中没有做任何事情,所以它可以被编译器优化(跳过)。看起来你是指“性能”而不是“生产力”。高级语言提高了生产率(有时在一些性能开销上)。.在C程序中,如果要将结果转换为毫秒,则应乘以1000,而不是除以1000。结果应为810。除了@Dikei和@Space所说的,您可能正在对调试版本进行基准测试(这是每个新手在尝试进行基准测试时遇到的第一个困难)任何一个象形的C++编译器都会看到循环在一个版本中没有任何作用,并将它优化为虚无。因此,如果C++中的循环中花费了所有的时间,那么你就不可能测量一个版本的构建。谢谢。现在我清楚了。但是我仍然在想,java的速度是多少?这完全取决于应用程序。例如,如果你有很多数组被来回复制,Java甚至可以更快,因为你不能有重叠的数组(这允许编译器更好地优化代码)@OneMore:这与生产率无关,但与性能无关。@aioobe:当然有上千个因素,但在这种情况下,还有上千个因素。平方。你根本无法对编程语言进行基准测试。你可以对编程语言实现进行基准测试,然后,综合基准测试对任何pra都几乎毫无用处事实上,时间计算是错误的,确实做了一些错误的事情。在C++程序中计算的时间是一百万倍。即使你调整了,我的机器上的C++结果也是0。