[八卦] D语言的性能不一定比Java强
redsea
2007-12-02
Colorful 写道 VC 2008下花费的时间为550 ~ 565 MinGW(即GCC 3.4.5)时间为360 ~ 370 .NET 3.5下花费时间为960 ~ 980 C#花费的时间是VC 2008的2倍,MinGW的3倍左右。 DMD 2.008下花费时间为410 ~ 418 D比起C/C++大概是MinGW的1.1倍,VC 2008的0.75倍,C#的0.43倍左右。 这个数据看起来就有道理多了 我怀疑之前你的数据有问题, 优化即使差一些, 差一个数量级也就顶天了, 加上递归层次其实有限, IO 还要占时间, 绝不至于差那么多, 因此我怀疑到你测试整个程序的运行时间, 并且受到防病毒软件的干扰去了 ;) |
|
fxsjy
2007-12-02
怎么没有Java的测试数据啊?
Colorful 写道 上次的测试把时间单位搞错了,所以出现了很“惨”的答案,呵呵,这一次重新把完整的测试代码给贴上。
另外,qiezi提到了VC的优化问题(该问题在C#和DMD中不会出现),为了避免该问题,修正了测试代码。 测试平台 Windows XP SP2 + AMD 1700+ 时间单位 毫秒 因为机器上没有C/C++环境,所以安装了VC 2008和GCC的Win移植MinGW。 C/C++代码 #include <iostream> #include "Windows.h" using namespace std; int fib(int n) { if(n==0 || n==1) return n; else { return fib(n-1)+fib(n-2); } } int main() { int arr[36]; LARGE_INTEGER li; if(QueryPerformanceFrequency(&li)) { QueryPerformanceCounter(&li); long long j = li.QuadPart; for(int i=0;i<=35;i++) { arr[i] = fib(i); } QueryPerformanceCounter(&li); long long k = li.QuadPart; for(int i = 0; i <= 35; i++) { cout << arr[i] << '\n'; } cout << '\n'; cout << (k-j) / 10000 << '\n'; } else { unsigned int j = GetTickCount(); for(int i=0;i<=35;i++) { arr[i] = fib(i); } unsigned int k = GetTickCount(); for(int i = 0; i <= 35; i++) { cout << arr[i] << '\n'; } cout << '\n'; cout << (k-j) << '\n'; } return 0; } VC 2008下花费的时间为550 ~ 565 MinGW(即GCC 3.4.5)时间为360 ~ 370 C#测试代码 using System; using System.Diagnostics; namespace Colorful.CSharp.Sample { class Program { static void Main(string[] args) { int[] arr = new int[36]; Stopwatch watch = Stopwatch.StartNew(); for (int i = 0; i <= 35; i++) { arr[i] = fib(i); } watch.Stop(); for (int i = 0; i <= 35; i++) { Console.WriteLine(arr[i]); } Console.WriteLine(); Console.WriteLine(watch.ElapsedMilliseconds); } static int fib(int n) { if (n == 0 || n == 1) return n; else { return fib(n - 1) + fib(n - 2); } } } .NET 3.5下花费时间为960 ~ 980 C#花费的时间是VC 2008的2倍,MinGW的3倍左右。 接下来是D测试代码 import std.stdio; import std.c.windows.windows; int fib(int n){ if(n==0 || n==1) return n; else{ return fib(n-1)+fib(n-2); } } void main() { int[36] arr; long li; if(QueryPerformanceFrequency(&li)) { QueryPerformanceCounter(&li); long j = li; for(int i=0;i<=35;i++) { arr[i] = fib(i); } QueryPerformanceCounter(&li); long k = li; for(int i = 0; i <= 35; i++) { writefln(arr[i]); } writefln(); writefln((k-j) / 10000); } else { uint j = GetTickCount(); for(int i=0;i<=35;i++) { arr[i] = fib(i); } uint k = GetTickCount(); for(int i = 0; i <= 35; i++) { writefln(arr[i]); } writefln(); writefln((k-j)); } } DMD 2.008下花费时间为410 ~ 418 D比起C/C++大概是MinGW的1.1倍,VC 2008的0.75倍,C#的0.43倍左右。 答案已经很明显了。此外,D的模板递归也算是其亮点之一,^_^ |
|
cjbbug
2007-12-04
C/C++代码 #include <iostream> #include "Windows.h" using namespace std; int fib(int n) { if(n==0 || n==1) return n; else { return fib(n-1)+fib(n-2); } } int main() { int arr[36]; LARGE_INTEGER li; if(QueryPerformanceFrequency(&li)) { QueryPerformanceCounter(&li); long long j = li.QuadPart; for(int i=0;i<=35;i++) { arr[i] = fib(i); } QueryPerformanceCounter(&li); long long k = li.QuadPart; for(int i = 0; i <= 35; i++) { cout << arr[i] << '\n'; } cout << '\n'; cout << (k-j) / 10000 << '\n'; } else { unsigned int j = GetTickCount(); for(int i=0;i<=35;i++) { arr[i] = fib(i); } unsigned int k = GetTickCount(); for(int i = 0; i <= 35; i++) { cout << arr[i] << '\n'; } cout << '\n'; cout << (k-j) << '\n'; } return 0; } VC 2008下花费的时间为550 ~ 565 MinGW(即GCC 3.4.5)时间为360 ~ 370 在我机器上 MINGW GCC 4.2.2 时间为246-272 |
|
cjbbug
2007-12-04
再说一下,我的机器刚安装上,没有装杀毒软件。
|
|
cjbbug
2007-12-04
不好意思,多发了一次。
|
|
scroot
2007-12-05
毫无意义
|