看到很多新手对C#的执行效率抱有疑问.不禁自己亲手测试了一下.使用插入排序的办法对堆栈中的变量进行排序.考虑到泛型和摸版的效率差别不大.这里就暂时只考虑堆栈中变量的效率测试(我想高手会对我有点意见,但是就算是泛型的效率也应该很高吧).测试机器:P4 2.8GHz, RAM 768MB, windows xp professional sp2
// C#
class Program
{
public void Sort(int[] arr)
{
for (int i = 1; i < arr.Length; i++)
{
int t = arr[i];
int j = i;
while ((j > 0) && (arr[j - 1] > t))
{
arr[j] = arr[j - 1];//交换顺序
--j;
}
arr[j] = t;
}
}
static void Main(string[] args)
{
int[] iArrary = new int[30000];
Random rd = new Random();
for (int i = 0; i < 30000; i++)
{
iArrary[i] = rd.Next(0, 9999);
}
long begin = DateTime.Now.Ticks;
Program q = new Program();
q.Sort(iArrary);
long end = DateTime.Now.Ticks;
for (int m = 0; m < 30000; m++)
Console.WriteLine("{0}", iArrary[m]);
Console.Write(end - begin);
Console.ReadLine();
}
}
执行时间:1.5秒整.
//C++
void sort(int *a, int length)
{
for (int i = 1; i < length; i++)
{
int t = a[i];
int j = i;
while ((j > 0) && (a[j - 1] > t))
{
a[j] = a[j - 1];//交换顺序
--j;
}
a[j] = t;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int buffer[30000];
int length = 30000;
srand((unsigned)GetCurrentTime());
for(int i = 0; i < length; i++)
{
buffer[i] = rand();
}
DWORD dwStart,dwStop;
dwStart = GetTickCount();
sort(buffer,length);
dwStop = GetTickCount();
printf("Time: %d /n",(dwStop - dwStart));
char ch;
scanf("ss %c",&ch);
return 0;
}
执行时间:1.25秒
然后我将数组改成 80000.执行时间分别为10.87秒和9.125秒.等出结论,在时间复杂度和空间复杂度的计算上.C#执行效率比C++慢26%.也就是说需要将时间精确到秒为单位的系统将不用考虑误差的问题而放心使用C#.又或者说这样的效率比较是绝对可以忍受的.因为这里的例子同样使用的是堆栈,同样使用的选择排序算法.一个用指针,一个用索引块,一个用机器码一个用JIT及时编译.所以能将差距缩小到这个份上C#确实不简单.而相较于C#提供的便利来说,26%的性能损失完全可以接受.