为什么(我的)Java比C++快25倍
Why is (my) Java 25x times faster than C++?
当我想将它与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)+ "%");
}
}
相关文章:
- 我想知道长双倍和双倍之间的区别
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- 如何编写一个使用n倍三元条件语句的C++布尔函数
- 按值 C++ 返回时进行双倍移动
- 求和 int 乘以双倍时的欠/过近似
- 从'size_t'转换为"常量双倍",可能会丢失数据
- 二叉搜索不收敛为双倍
- 编写一个代码,使年利率翻倍
- 将一个双倍值乘以10会发生什么
- C++数组与向量排序(在我的情况下,向量比数组慢~2.5倍(无优化))
- 将非常大的 int 转换为双倍,在某些计算机上会损失精度
- 双吨级 - 从单级过渡到双倍级
- 解决方案在第 25 行执行错误'out of bounds'
- 如何将包含指数的 QString 转换为C++中的双倍?
- 计算阶乘的 C++17 倍表达式中的错误
- 防止在字符数组中输入双倍空格在 C++
- 将uintptr_t转换为布尔值会使 SSO 基准速度减慢数倍
- 将双倍转换为 LPARAM 的麻烦
- 重复使用预分配的向量<复杂<double>>作为<double>长度两倍的向量
- 为什么(我的)Java比C++快25倍