C#和java求圆周率的近似值的比较
2017-01-10 03:11
211 查看
话说,天朝在数千年就诞生了几个超级变态,其中尤以祖冲之为超级变态,竟然用刘微的“割圆术”将圆周率推算到7位,他推算出π在3.1415926~3.1415927之间。然后领先世界千年。我表示我想不通他们大脑的构造。
后来,圆周率有了这些求法:
我选择第二种。
观察得知,第一个数为2/1,并且后一位数的分子是前一位数的分母+1,后一位数的分母是前一位数的分子+1;于是可以动手了。
C#求圆周率近似值代码:
java版代码:
发现调试模式下的运行会占用时间,所以,C#应该点击.exe文件运行,java使用java -jar xxx.jar命令运行。
C#运行图:
我表示很奇怪,第1亿次循环怎么会这么久,第10亿次更是久久不出来。莫非C#充满了垃圾了?所以使用第二个方法:printPI_2( ) 打印。结果:
相差了10倍。看来确实被判断整数位数的方法影响了。
再看java的结果:
1亿次近6秒,十亿次用67秒。居然比C#跑得快了差不多10倍。
第二个方法printPI_2( ):
结果又比C#快了3倍。。。汗水如瀑布。到底是什么原因呢?很奇怪。
十亿次循环,第二个方法printPI_2( ):C#用时76秒又777毫秒;java用时22秒又175毫秒。
真是奇怪。
为什么在这里java跑的比C#快。难道是TimeSpan的原因?
这样看来,C#或许在某些时候并不比java效率高。虽然java是所谓解释性语言,而C#继承了C和C++的优良基因。
后来,圆周率有了这些求法:
我选择第二种。
观察得知,第一个数为2/1,并且后一位数的分子是前一位数的分母+1,后一位数的分母是前一位数的分子+1;于是可以动手了。
C#求圆周率近似值代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 圆周率计算 { class Program { static void Main(string[] args) { //printPI(); printPI_2(); } static void printPI() { DateTime time = System.DateTime.Now; TimeSpan timeSpanOld = new TimeSpan(time.Ticks); Console.WriteLine("开始..."); long fenmu = 1;//分母 long fenzi = 2;//分子 double pi = 2 * fenzi / fenmu; int flag = 0; long i = 0; int lenght = 1; while (true) { i++; //Console.Writeline("第" + i + "次:"); long temp = fenmu; fenmu = fenzi + 1; fenzi = temp + 1; pi *= (double)fenzi / (double)fenmu; //Console.WriteLine("pi=" + pi); int newLenght = getNumLenght(i); if (newLenght > lenght) { lenght = newLenght; DateTime newTime = System.DateTime.Now; TimeSpan timeSpanNew = new TimeSpan(newTime.Ticks); TimeSpan tickTimeSpan = timeSpanNew.Subtract(timeSpanOld).Duration(); long millis = (long)tickTimeSpan.TotalMilliseconds; int second = (int)millis / 1000; int milliSecond = (int)millis % 1000; Console.WriteLine("第" + i + "次循环\n pi=" + pi + " 耗时:" + second + "秒又" + milliSecond + "毫秒, ");//循环每增加一级,打印一次 } } Console.ReadLine(); } static void printPI_2() { DateTime time = System.DateTime.Now; TimeSpan timeSpanOld = new TimeSpan(time.Ticks); Console.WriteLine("开始..."); long fenmu = 1;//分母 long fenzi = 2;//分子 double pi = 2 * fenzi / fenmu; int flag = 0; long i = 0; int lenght = 1; while (true) { i++; //Console.Writeline("第" + i + "次:"); long temp = fenmu; fenmu = fenzi + 1; fenzi = temp + 1; pi *= (double)fenzi / (double)fenmu; //Console.WriteLine("pi=" + pi); if (i == 100000000) { DateTime newTime = System.DateTime.Now; TimeSpan timeSpanNew = new TimeSpan(newTime.Ticks); TimeSpan tickTimeSpan = timeSpanNew.Subtract(timeSpanOld).Duration(); long millis = (long)tickTimeSpan.TotalMilliseconds; int second = (int)millis / 1000; int milliSecond = (int)millis % 1000; Console.WriteLine("第" + i + "次循环\n pi=" + pi + " 耗时:" + second + "秒又" + milliSecond + "毫秒, "); } } Console.ReadLine(); } /* * 求取整数的位数 */ static int getNumLenght(long num) { int lenght = 0; for (long temp = num < 0 ? -num : num; temp > 0; temp /= 10) { lenght++; } return lenght; } } }
java版代码:
package date0110am.圆周率; class Program { public static void main(String[] args) { // printPI(); printPI_2(); } static void printPI() { long oldCurrMillis = System.currentTimeMillis(); System.out.println("开始..."); long fenmu = 1;//分母 long fenzi = 2;//分子 double pi = 2*fenzi/fenmu; long i = 0; int lenght = 1; while(true){ i++; //Console.Writeline("第" + i + "次:"); long temp = fenmu; fenmu = fenzi + 1; fenzi = temp + 1; pi *= (double)fenzi / (double)fenmu; //System.out.println("pi=" + pi); int newLenght = getNumLenght(i); if(newLenght > lenght){ lenght = newLenght; long countMillis = System.currentTimeMillis()-oldCurrMillis ; int second = (int) (countMillis / 1000); int milliSecond = (int) (countMillis % 1000); System.out.println("第" + i + "次循环\n pi=" + pi + " 耗时:" + second + "秒又" + milliSecond + "毫秒 ");//循环每增加一级,打印一次 } } // System.console().readLine(); } static void printPI_2() { long oldCurrMillis = System.currentTimeMillis(); System.out.println("开始..."); long fenmu = 1;//分母 long fenzi = 2;//分子 double pi = 2*fenzi/fenmu; long i = 0; while(true){ i++; long temp = fenmu; fenmu = fenzi + 1; fenzi = temp + 1; pi *= (double)fenzi / (double)fenmu; if(i==1000000000){ long countMillis = System.currentTimeMillis()-oldCurrMillis ; int second = (int) (countMillis / 1000); int milliSecond = (int) (countMillis % 1000); System.out.println("第" + i + "次循环\n pi=" + pi + " 耗时:" + second + "秒又" + milliSecond + "毫秒 ");//循环每增加一级,打印一次 } } // System.console().readLine(); } /* * 求取整数的位数 */ static int getNumLenght(long num){ int lenght = 0; for (long temp = num < 0? -num : num ; temp > 0; temp/=10){ lenght++; } return lenght; } }
发现调试模式下的运行会占用时间,所以,C#应该点击.exe文件运行,java使用java -jar xxx.jar命令运行。
C#运行图:
我表示很奇怪,第1亿次循环怎么会这么久,第10亿次更是久久不出来。莫非C#充满了垃圾了?所以使用第二个方法:printPI_2( ) 打印。结果:
相差了10倍。看来确实被判断整数位数的方法影响了。
再看java的结果:
1亿次近6秒,十亿次用67秒。居然比C#跑得快了差不多10倍。
第二个方法printPI_2( ):
结果又比C#快了3倍。。。汗水如瀑布。到底是什么原因呢?很奇怪。
十亿次循环,第二个方法printPI_2( ):C#用时76秒又777毫秒;java用时22秒又175毫秒。
真是奇怪。
为什么在这里java跑的比C#快。难道是TimeSpan的原因?
这样看来,C#或许在某些时候并不比java效率高。虽然java是所谓解释性语言,而C#继承了C和C++的优良基因。
相关文章推荐
- Java vs C# —— JAVA 与.NET 在前途上面的比较
- C++ Java C#的比较-成员归属权的表示
- Java与C#个人之比较
- C# 与 C 、 C++ 、 D 、 Java 的性能比较(三)
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- 挺有意思的比较,JAVA与C#。
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- C#与Java的比较(转二)
- Java与C#个人之比较
- C# 与 C 、 C++ 、 D 、 Java 的性能比较(二)
- C++ Java C#的比较-命名空间
- C#与C++、Java之比较概览
- C#和java比较
- C#与Java的比较
- C#与Java之比较
- C#与C++、Java之比较概览
- C++、Java/C#之比较
- J2EE vs. NET, Java vs. C#:比较公正的评价
- Java,C#,C++在继承,覆盖和多态,抽象类等几个方面的比较归纳
- C#、Java之比较