数字计算效率C++和Java。
做了个小测试,分别用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 + "毫秒");
}
}
}