【问题标题】:Why is (my) Java 25x times faster than C++?为什么(我的)Java 比 C++ 快 25 倍?
【发布时间】:2018-08-12 06:47:15
【问题描述】:

当我想将它与 C++ 进行比较时,我正在使用 Java 中的一些 FizzBu​​zz 代码。

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

Java Eclipse IDE 运行时:11 秒

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

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

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

为什么会这样?我所掌握的每一条信息都表明 C++ 应该运行得更快。

Java 代码:

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;
}

这只是给出了 Fizz/Buzzes 的百分比计数。

这只是我的 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 之外它几乎可以立即运行。 似乎打印需要很多时间。

【问题讨论】:

  • 你是如何编译你的 C++ 的?您是否使用了任何优化标志?如果您的编译器为了调试目的而避免大多数优化并发出一些东西,那么讨论速度是没有意义的。
  • 也许你没有在发布模式下构建你的程序,或者在没有任何优化的情况下构建它。您还应该尝试在您的 IDE 之外运行您的代码 - 您的程序会产生大量文本输出,并且某些 IDE 可能会花费大量时间来显示所有这些输出,而不是让您的程序尽可能快地运行。 (你的 C++ 程序需要 5 秒才能在我的机器上完成..)
  • 第一步:关闭:sync_with_stdio
  • 而不是endl 使用'\n'
  • std::endl 是邪恶的

标签: java c++ eclipse optimization visual-studio-2017


【解决方案1】:

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

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

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

然后我尝试用控制台运行java,它比在IDE中运行花费的时间要长得多。

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

然后我把java代码改成buffered writer,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("\r\n");
                normals++;
            }
            else {
                sout.write(output.toString());
                sout.write("\r\n");
            }


            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)+ "%");


    }
}

【讨论】:

    猜你喜欢
    • 2016-07-07
    • 2013-06-06
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2011-08-22
    • 2015-02-10
    • 2017-05-17
    相关资源
    最近更新 更多