代码一:helloworld.cpp #include <iostream> int main(int argc, char *argv[]) { std::cout << "Hello World" << std::endl; return 0; }; Hello World程序的C#代码如下:
代码二:helloworld2.cs
using System;
namespace HelloWorld
{
class Class1
{
static void Main(string[] args)
{
Console.WriteLine("Hello World");
}
}
} 从这个测试的结果中,我们可以看到程序在相应环境中的加载时间。对于一个只完成简单任务的程序来说,无疑我们需要它能快速加载和退出。Perl脚本是个有代表性的例子,运行这种需要大量的加载时间,从而导致其不能满足基于CGI且面向性能的Web站点的需要。这时,人们常常选择C++程序替Perl脚本。但对于需要长时间处于激活状态的程序,其加载时间相对运行时性能来说就显得并不是那么很重要了。下表是十次测试的结果:
表一:Hello World 测试结果
序号
C++(~毫秒)
C#(~毫秒)
1
40
1221
2
20
121
3
10
130
4
10
100
5
10
110
6
10
130
7
10
120
8
10
140
9
10
150
10
20
140
平均值
15
235
测试结果的精确程度由GetTickCount函数的精度决定。其精度大概在百分之一秒。从结果我们可以得出这样的结论。第一,冷启动.NET应用过程所花费的时间比运行相同的应用多出一秒的时间。第二,启动后的程序再运行时,在C++代码大约是C#代码运行时间开销的十分之一。一般这种差别可以忽略不计。
埃拉托色尼过滤算法测试
埃拉托色尼过滤算法测试程序评估基本的整型算法和比较逻辑。这个算法历史悠久,它早在计算机出现之前就已经存在。因此用它来评估人们在各种环境中创建的算法性能具有一定的典型性或代表性。
埃拉托色尼过滤算法的C++代码如下:
代码三:sieve.cpp #include <windows.h> #include <iostream> #include <algorithm> #include <vector> #include <cstdlib> using namespace std; int main(int argc, char *argv[]) { if (argc != 2) { std::cerr << "Usage:\tsieve [iterations]\n"; return 1; }; size_t NUM = atoi(argv[1]); DWORD dw = ::GetTickCount(); vector primes(8192 + 1); vector::iterator pbegin = primes.begin(); vector::iterator begin = pbegin + 2; vector::iterator end = primes.end(); while (NUM--) { fill(begin, end, 1); for (vector::iterator i = begin; i < end; ++i) { if (*i) { const size_t p = i - pbegin; for (vector::iterator k = i + p; k < end; k += p) { *k = 0; } } } } DWORD dw2 = ::GetTickCount(); std::cout << "Milliseconds = " << dw2-dw << std::endl; return 0; }下面是埃拉托色尼过滤算法的C#代码:
代码四:
using System;
namespace Sieve
{
class Class1
{
static void Main(string[] args)
{
if (args.Length != 1)
{
Console.WriteLine("Usage:\tsieve "
"[iterations]");
return;
}
int NUM = int.Parse(args[0]);
long dt = DateTime.Now.Ticks;
int[] primes = new int[8192+1];
int pbegin = 0;
int begin = 2;
int end = 8193;
while (NUM-- != 0)
{
for (int i = 0; i < end; i++)
{
primes[i] = 1;
}
for (int i = begin; i < end; ++i)
{
if (primes[i] != 0)
{
int p = i - pbegin;
for (int k = i + p; k < end; k += p)
{
primes[k] = 0;
};
}
};
};
long dt2 = DateTime.Now.Ticks;
System.Console.WriteLine("Milliseconds = {0}",
(dt2-dt)/10000);
}
}
} 测试的结果并不足以说明那一种环境更快。在这两个语言的测试中,我旨在说明哪一种语言的构造对测试的结果影响最大。当你基于性能的考虑来选择某种语言时,应该直接考虑心需要哪种类型的性能。在这里,埃拉托色尼过滤算法测试的是循环构造以及比较逻辑和整数基本类型的处理。下面是十次测试,每次进行10000次重复的测试结果:
表二:过滤算法测试结果
序号
C++(~毫秒)
C#(~毫秒)
1
1342
2724
2
1342
2714
3
1342
2724
4
1342
2724
5
1342
2734
6
1342
2724
7
1362
2734
8
1352
2734
9
1362
2724
10
1352
2724
平均值
1348
2726
这个结果很能说明问题。整数计算C#所花的时间是C++的两倍。所以对于一个逻辑复杂的服务器来说,使用非受管C++代码比C#代码更适合。
上面的C++代码和C#代码之间有一个差别,即C#使用的是本机数组,而C++代码用的是向量模板类,我用本机数组重写了C++代码,按说应该更快。是结果不是这样,本机C++数组执行用时是1900毫秒。(待续)
本文地址:http://com.8s8s.com/it/it2152.htm