为什么(我的)Java比C++快25倍

Why is (my) Java 25x times faster than C++?

本文关键字:C++ 25倍 Java 我的 为什么      更新时间:2023-10-16

当我想将它与C++进行比较时,我正在用Java玩一些FizzBuzz代码。

我在 Java 中运行了

下面的代码,并在 C++ 中运行了基本相同的代码。

Java Eclipse IDE 运行时:11 秒

C++代码块 IDE 运行时间:202 秒(比 Java 慢约 18 倍(

C++ Visual Studio IDE运行时:281秒(比Java慢约25倍(

据我所知,我已经安装了所有这些 IDE 的最新版本。

为什么会这样?我掌握的每一条信息都说C++应该跑得更快。

爪哇代码:

public class Test {
public static void main(String []args) {
    double fizzes = 0;
    double buzzes = 0;
    double fizzbuzzes = 0;
    double normals = 0;
    double iterations = 1000000;
    for (int x = 0; x < iterations; x++) {

        int index = 0;
        String output = "";
        if (x % 3 == 0) {
            output = output + "Fizz";
            index = 1;
        }
        if (x % 5 == 0) {
            output = output + "Buzz";
            index = index + 2;
        }
        if (output == "") { //x%5!=0 && x%3!=0
            System.out.println(x);
            normals++;
        }
        else {
            System.out.println(output);
        }

        if (index == 3) {
            fizzbuzzes++;
        }
        else if (index == 2) {
            buzzes++;
        }
        else if (index == 1) {
            fizzes++;
        }

    }
    System.out.println("Normals " + (normals/iterations*100) + "%"); //percent
    System.out.println("Fizzes " + (fizzes/iterations*100)+ "%");
    System.out.println("Buzzes " + (buzzes/iterations*100)+ "%");
    System.out.println("FizzBuzzes " +(fizzbuzzes/iterations*100)+ "%");

}
}

C++代码:

#include "stdafx.h"
#include "iostream"
using namespace std;

int main()
{
double fizzes = 0;
double buzzes = 0;
double fizzbuzzes = 0;
double normals = 0;
double iterations = 1000000;
for (int x = 0; x < iterations; x++) {

    int index = 0;
    string output = "";
    if (x % 3 == 0) {
        output = output + "Fizz";
        index = 1;
    }
    if (x % 5 == 0) {
        output = output + "Buzz";
        index = index + 2;
    }
    if (output == "") { //x%5!=0 && x%3!=0
        cout << x<< endl;
        normals++;
    }
    else {
        cout << (output)<< endl;
    }

    if (index == 3) {
        fizzbuzzes++;
    }
    else if (index == 2) {
        buzzes++;
    }
    else if (index == 1) {
        fizzes++;
    }

}
cout << "Normals " << (normals / iterations * 100) <<"%"<<  endl; //percentage
cout << "Fizzes " << (fizzes / iterations * 100) << "%" << endl;
cout << "Buzzes " << (buzzes / iterations * 100) << "%" << endl;
cout << "FizzBuzzes " << (fizzbuzzes / iterations * 100) << "%" << endl;
return 0;
}

这只是以百分比形式给出嘶嘶声/嗡嗡声的计数。

这只是我的 IDE 配置的结果吗?

编辑:将C++代码更改为您的建议

#include "stdafx.h"
#include <iostream>
#include <string>

int main()
{
double fizzes = 0;
double buzzes = 0;
double fizzbuzzes = 0;
double normals = 0;
double iterations = 1000000;
for (int x = 0; x < iterations; x++) {

    int index = 0;
    std::string output = "";
    if (x % 3 == 0) {
        output = output + "Fizz";
        index = 1;
    }
    if (x % 5 == 0) {
        output = output + "Buzz";
        index = index + 2;
    }

    if (index == 3) {
        fizzbuzzes++;
    }
    else if (index == 2) {
        buzzes++;
    }
    else if (index == 1) {
        fizzes++;
    }
    if (output == "") { //x%5!=0 && x%3!=0
        //std::cout << x << "n";
        normals++;
    }
    //else {
    //  std::cout << output << "n";
    //}
}
std::cout << "Normals " << (normals / iterations * 100) <<"%"<<  "n"; //percentage
std::cout << "Fizzes " << (fizzes / iterations * 100) << "%" << "n";
std::cout << "Buzzes " << (buzzes / iterations * 100) << "%" << "n";
std::cout << "FizzBuzzes " << (fizzbuzzes / iterations * 100) << "%" << "n";
int z;
std::cin >> z; //so i can see the values
return 0;
}

同样在发布模式下构建,在 IDE 之外,它几乎可以立即运行。似乎打印需要很多时间。

这很有趣,我在我的电脑上测试了这个,结果是一样的。

然后我尝试在 java 和 c++ 中禁用打印(使用 -O3 发布(,两者的时间使用时间为 <3 秒。

所以

问题每次都是cout刷新,但是java在IDE内部运行,IDE会缓冲所有的输出,所以这应该是java比c++快的原因。

然后我尝试使用控制台运行 java,这比在 IDE 中运行要长得多。

这应该与将 c++ 输出定向到/dev/null 的测试保持一致 https://stackoverflow.com/users/3807729/galik

然后,我将 Java 代码更改为缓冲编写器,在 IDE 中将时间减少到 5 秒。

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
public class Test {
    public static void main(String []args) throws Exception{
        double fizzes = 0;
        double buzzes = 0;
        double fizzbuzzes = 0;
        double normals = 0;
        double iterations = 1000000;

        BufferedWriter sout = new BufferedWriter(new OutputStreamWriter(new
                FileOutputStream(java.io.FileDescriptor.out),"ASCII"), 1024);
        for (int x = 0; x < iterations; x++) {

            int index = 0;
            StringBuilder output = new StringBuilder();
            if (x % 3 == 0) {
                output.append("Fizz");
                index = 1;
            }
            if (x % 5 == 0) {
                output.append("Buzz");
                index = index + 2;
            }
            if (output.length()==0) { //x%5!=0 && x%3!=0
                sout.write(String.valueOf(x));
                sout.write("rn");
                normals++;
            }
            else {
                sout.write(output.toString());
                sout.write("rn");
            }

            if (index == 3) {
                fizzbuzzes++;
            }
            else if (index == 2) {
                buzzes++;
            }
            else if (index == 1) {
                fizzes++;
            }

        }
        System.out.println("Normals " + (normals/iterations*100) + "%"); //percent
        System.out.println("Fizzes " + (fizzes/iterations*100)+ "%");
        System.out.println("Buzzes " + (buzzes/iterations*100)+ "%");
        System.out.println("FizzBuzzes " +(fizzbuzzes/iterations*100)+ "%");

    }
}