数字计算效率C++和Java。

MrBone 2009-06-08 11:18:51
做了个小测试,分别用C++和Java编写了一个计算圆周率PI的小程序,计算结果是Java的居然比C++的快同样计算了5W位,C++耗时1211560MS,Java耗时681156,我属于菜鸟中的菜鸟,但印象里好像有人说过C++比Java更擅长类似于这种计算,哪位牛人能解释下我的疑惑么?为什么我的这个测试会Java更快些?前来鄙视的就飘过吧~

下附两段小程序:

C++:

#include <iostream> //π的计算公式:π/2=1+1!/3!!+2!/5!!+3!/7!!+...+k!/(2*k+1)!!+...
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

using namespace std;

int main(int argc,char *argv[])
{
double time_start, time_finish, time_compute;
int modeofout = 0;
time_start = clock();

const int SIZE=atoi(argv[1])+10,WEI=atoi(argv[1]);
int *x=new int[SIZE]; int *z=new int[SIZE];
int a=1,b=3,c,d,Run=1,Cut=0; //A是分子里的项,B是分母里的项。C和D是中间变量。
for(int XoX=0;XoX <SIZE;XoX++) //初始化数字Z,X数组的每一项,都赋值为0。
{x[XoX]=0;z[XoX]=0;}
x[1]=2;z[1]=2;

while(Run&&(++Cut <200000)) //主体
{
d=0;

for(int i=SIZE-1;i>0;i--) //计算通项的分子,并把分子的值赋值给数组Z。
{
c=z[i]*a+d;
z[i]=c%10;
d=c/10;
}

d=0;

for(i=0;i <SIZE;i++) //计算z/=b,就是把1/1,(1×2)/3,(1×2×3)/(3×5)……分别放入z中
{
c=z[i]+d*10;
z[i]=c/b; //保证z中只存放一个个位数,如果z中的数大于10,则需取得十位数加至z[i-1]
d=c%b;
}

Run=0;

for(i=SIZE-1;i>0;i--) //把数组Z里的值累加到数组X里,模仿乘法的竖式计算,从后向前写入。
{
c=x[i]+z[i];
x[i]=c%10;
x[i-1]+=c/10;
Run|=z[i];
}

a++;
b+=2;
cout <<"第" <<Cut <<"次运算!\n";
}

time_finish = clock();
time_compute = double(time_finish-time_start);
switch (modeofout)
{
case 0:
{
FILE *fileofout = fopen (argv[2], "w");
fprintf (fileofout, "pi = %d.", x[1]);
for (int i = 2; i < SIZE; i++)
fprintf(fileofout,"%d",x[i]);
for(i=0;i <50;i++)cout <<"-";
cout <<"\n共进行了计算了" <<Cut <<"次!\n";
cout <<"小数点后" <<WEI <<"位的";
cout <<"i=" <<x[1] <<".\n";

for(i=0;i <WEI;i++)
{
if (i&&((i%5)==0)) cout <<' ';
if (i&&((i%50)==0))cout <<"\r\n";
cout <<(int)x[i+2];
}

cout <<"计算时间为" << time_compute <<"ms\n";
cout <<endl;
}
break;
case 1:
{
for(int i=0;i <50;i++)cout <<"-";
cout <<"\n共进行了计算了" <<Cut <<"次!\n";
cout <<"小数点后" <<WEI <<"位的";
cout <<"i=" <<x[1] <<".\n";

for(i=0;i <WEI;i++)
{
if (i&&((i%5)==0)) cout <<' ';
if (i&&((i%50)==0))cout <<"\r\n";
cout <<(int)x[i+2];
}

cout <<"计算时间为" << time_compute <<"ms\n";
cout <<endl;
}
cout <<endl;
break;

}
}

java:

import java.util.Date;
import java.io.*;

public class PI {
public static void main(String[] args) {

//程序运行初始时间
Date date = new Date();
long previousTime = date.getTime();
long lastTime = 0;

//设置1个参数,如果等于1,则计算并把结果写入文件,且计算时间,如果等于2,计算并计算时间,不写文件,但计算结果,在 屏幕输出 如果等于3,only计算,不在屏幕输出结果,只显示计算时间~
int choose = 0;

try {
choose = Integer.parseInt(args[0]);
} catch(ArrayIndexOutOfBoundsException e) {
System.out.println("Please input a number to choose the way that you want to see!");
System.exit(-1);
} catch(Exception e) {
System.out.println("Please input a correct number!");
System.exit(-1);
}



//将结果输出到文件中
File f = new File("d://PI_2.txt");
String strEncode = "UTF-8";

BufferedWriter bw = null;
try {
bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(f), strEncode));
} catch(IOException e) {
e.printStackTrace();
}

StringBuilder sb = new StringBuilder();


/*定义存放结果的数组大小和要显示的位数,即火车车厢的个数*/
int ARRSIZE = 1100;
int DISPCNT = 1000;

/* x数组存放π的值,z数组存放迭加单项,生成火车 */
int[] x = new int[ARRSIZE];
int[] z = new int[ARRSIZE];
int a = 1;
int b = 3;
int c = 0;
int d = 0;
int Cut = 0;

x[1] = 2;
z[1] = 2;
/* 开始计算(开始填充各个车厢) */

while(++Cut < 100000) {
d=0;
/* 以下代码完成了z+=a的功能 */
/* 就是将1,1×2,1×2×3,…分别放入z中 */
for (int i=ARRSIZE-1; i>0; i--) {
c = z[i] * a + d;
/* 以下两行保证z中只存放一个个位数 */
/* 如果z中的数大于10,则需取得十位数加至z[i-1] */
/* 这就是在模拟竖式中的进位 */
z[i] = c % 10;
d = c / 10;
}
d = 0;
/* 以下代码完成了z/=b的功能 */
/* 就是将1/1,(1×2)/3,(1×2×3)/(3×5),…分别放入z中 */

for (int i=0; i<ARRSIZE; i++) {
c = z[i] + d * 10;
/* 以下两行保证z中只存放一个个位数 */
/* 如果z中的数大于10,则需取得十位数加至z[i-1] */
z[i] = c / b;
d = c % b;
}

/* 以下代码完成了x+=z的功能,就是将z分别迭加至x中 */
for (int i = ARRSIZE - 1; i > 0; i--) {
c = x[i] + z[i];
/* 以下两行保证x中只存放一个个位数 */
/* 如果x中的数大于10,则需取得十位数加至x[i-1] */
x[i] = c % 10;
x[i - 1] += c / 10;

//Run|=z;
/* "|="的运行方式:当z全为0时,Run便为0,否则为1 */
}
a++;
b += 2;
//System.out.println("第" + Cut + "次运算!");
}

/* 输出小数点后的所有位 */
for(int i=1; i<x.length; i++) {
if(i == 2) {
sb.append(".");
}
if(i%5 == 0) {
sb.append("");
}
if(i%50 == 0) {
sb.append("");
}
sb.append(x[i]);
}


//程序运行结束时间
date = new Date();
lastTime = date.getTime();
long useTime = lastTime - previousTime;

sb.append("\r");
sb.append("一共运行" + useTime + "毫秒");


if(choose == 1) {
try {
bw.write(sb.toString());
} catch(IOException e) {
e.printStackTrace();
} finally {
try {
bw.close();
} catch(IOException e) {
e.printStackTrace();
}
}

System.out.println("运行结果输出到D://PI_2.txt文件中");
}

if(choose == 2) {
System.out.println("-共进行计算" + Cut + "次!");
System.out.println("小数点后" + DISPCNT + "位");
System.out.println(sb.toString());
}

if(choose == 3) {
System.out.println("一共运行" + useTime + "毫秒");
}

}
}



...全文
262 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
小发猫 2009-07-14
  • 打赏
  • 举报
回复
同意你的意见,JAVA哈哈哈哈哈,算了吧。
yshuise 2009-06-08
  • 打赏
  • 举报
回复
楼主你的测试结果发上来看一下
fallening 2009-06-08
  • 打赏
  • 举报
回复
C++使用了编译优化选项了么?
chenzhp 2009-06-08
  • 打赏
  • 举报
回复
有多大的差别?
healer_kx 2009-06-08
  • 打赏
  • 举报
回复
大家对Java的偏见太深了,
Java的速度是非常快的,不至于那么差的,

我估计这个代码算起来,最后才IO出来一个结果的话,java最多比C++多花一点时间。
而Java的优化是相对的厉害的。
MrBone 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ltc_mouse 的回复:]
不知道楼主编译C++代码时用了release没有?

C++代码中似乎多了一个耗时的I/O操作“cout < <"第" < <Cut < <"次运算!\n"; ”,这个是不公平的~~
C++中的循环是while(Run&&(++Cut <200000)),而Java中的是while(++Cut < 100000),即这两段代码完成的功能相同吗?
[/Quote]

没用release

“cout < <"第" < <Cut < <"次运算!\n"; 这个我在测试的时候删掉了。

while(++Cut < 100000)这个我也统一了.

我第二次测试的时候上面两个问题已经改了,C++是快了一点点,但效果不是很高,我上面给的C++耗时1211560MS,Java耗时681156,是把我能意识到得不公平的地方都改过以后的结果。
ltc_mouse 2009-06-08
  • 打赏
  • 举报
回复
不知道楼主编译C++代码时用了release没有?

C++代码中似乎多了一个耗时的I/O操作“cout <<"第" <<Cut <<"次运算!\n"; ”,这个是不公平的~~
C++中的循环是while(Run&&(++Cut <200000)),而Java中的是while(++Cut < 100000),即这两段代码完成的功能相同吗?

说Java效率不够高,大概因为它是解释执行的,即执行的指令数要多一点,随着硬件水平提高,也许差别也不那么明显了...
记得挺早以前论坛上有讨论过,好像是一个深层次递归,java比C++快,具体是因为什么忘记了,楼主可以搜索下~~
diannaomingong 2009-06-08
  • 打赏
  • 举报
回复
不是C++计算慢,是io慢

先计算完再只输出一次结果看看?
MrBone 2009-06-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lsldd 的回复:]
什么编译器?
C++用release版还是debug版?
情况很多,代码不能说明一切。
[/Quote]

vc6.0
debug
yshuise 2009-06-08
  • 打赏
  • 举报
回复
把for循环,写成一个函数,然后inline(MSVC),inline可以优化代码,而不仅仅像书上说的那样。
lsldd 2009-06-08
  • 打赏
  • 举报
回复
什么编译器?
C++用release版还是debug版?
情况很多,代码不能说明一切。
xuhb95083023 2009-06-08
  • 打赏
  • 举报
回复
c++版本在我机器上的测试结果

1、debug 版本而且包含输出语句 cout < <"第" < <Cut < <"次运算!\n";
执行时间为 996703 ms

2、release版本而且包含输出语句 cout < <"第" < <Cut < <"次运算!\n";
执行时间为 407750 ms

3、release版本而且没有输出语句 cout < <"第" < <Cut < <"次运算!\n";
执行时间为 279953 ms

这种简单的数学运算c++和java估计相差不多,c++的数学运算的优势在于基于表达式模板的实现,例如基于表达式模板的矩阵运算效率甚至会超过fortran
xuhb95083023 2009-06-08
  • 打赏
  • 举报
回复
c++的代码,io的时间起码占了95%以上,这里比较的是io的速度,还有debug和release版本执行时间有时候会差10倍以上,完全没有可比性
zjx2388 2009-06-08
  • 打赏
  • 举报
回复
我做JAVA的,但曾经喜欢过C++
说C++比JAVA执行运算更快这应该是指C++的指针操作所带来的效果

快与不快与程序也会有一定的关系的
呵呵
如果不是特殊的应用,区别都不会太大

来顶贴的
aaaa3105563 2009-06-08
  • 打赏
  • 举报
回复
BUG
pathuang68 2009-06-08
  • 打赏
  • 举报
回复
楼上呢个计算的时间太长了,用这个式子来算pi看看:
pi = 4 * (1 - 1/3 + 1/5 - 1/7 + ... + 1/(2k - 1)) + ...
pathuang68 2009-06-08
  • 打赏
  • 举报
回复
这个话题很有意思,谢了!
MrBone 2009-06-08
  • 打赏
  • 举报
回复
我每次测试都重启下机器,然后不动任何东西,直接计算,就算有干扰因素也是两次计算都有干扰,相对来说还是公平的。
T技术沙龙 2009-06-08
  • 打赏
  • 举报
回复
这个,楼主能保证在运行的时候排除了一切有干扰的因素么?一个列子很难说明问题的
maxxfire 2009-06-08
  • 打赏
  • 举报
回复
关注~
加载更多回复(4)

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧