[八卦] 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
毫无意义
Global site tag (gtag.js) - Google Analytics