VS2010&.Net 4.0的Beta2相比Beta1在性能上有了很大的改进,已经基本可以使用了。.NET 4.0给我们带来许多新特性,如动态类型、云平台、并行运算等。本文讨论一下.NET 4.0的并行运算。
其实并行运算并不是在.Net 4.0才有的。大家都知道,通过增加CPU的主频可以提高CPU的性能,但由于设计的限制,主频是不可能无限制的提高。这个时候,把提高性能的方式转向使用多个心(多核),现在的电脑几乎都是多核的。但在中并还没有跟上这个节奏,大多数软件还是采用传统的方式,并没有很好的发挥多核的优势。
微软的并行运算平台(Microsoft’s Parallel Computing Platform (PCP))提供了这样一个工具,让软件开发人员可以有效的使用多核提供的性能。本文就进行一个简单的测试,来体验并行运算的性能。
1. 新建一个List,并在开始时初始化
public
static
IList<
int
> Datas =
new
List<
int
>();
static
void
Main(
string
[] args)
{
InitializeData();
Console.Read();
}
/// <summary>
/// 初始化数据
/// </summary>
private
static
void
InitializeData()
{
Datas.Clear();
for
(
int
i = 0; i < 20; i++)
{
Datas.Add(i);
}
}
2.设计耗时的方法,并来在各种运算方式中调用
/// <summary>
/// 获得数据
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
private
static
int
GetData(
int
i)
{
System.Threading.Thread.Sleep(100);
return
i;
}
3. 设计一般的运算方式,调用GetData方法
/// <summary>
/// 采用一般for循环
/// </summary>
private
static
void
UseFor()
{
for
(
int
i = 0; i < 20; i++)
{
GetData(Datas[i]);
}
}
/// <summary>
/// 采用一般的foreach
/// </summary>
private
static
void
UseForeach()
{
foreach
(var item
in
Datas)
{
GetData(item);
}
}
4.采用并行运算的方式,调用GetData方法
/// <summary>
/// 采用并行for循环
/// </summary>
private
static
void
UseParalleFor()
{
Parallel.For(0, 20, (i) =>
{
GetData(Datas[i]);
});
}
/// <summary>
/// 采用并行的foreach
/// </summary>
private
static
void
UserParalleForeach()
{
Parallel.ForEach(Datas, (t) => { GetData(t); });
}
5.最后采用CodeTimer来比较每一种运算方式的耗时,在Main函数中加入测试代码
static
void
Main(
string
[] args)
{
InitializeData();
CodeTimer.Initialize();
CodeTimer.WriteDebug(
"一般for循环:"
, 5, () => { UseFor(); });
CodeTimer.WriteDebug(
"一般foreach循环:"
, 5, () => { UseForeach(); });
CodeTimer.WriteDebug(
"并行for循环:"
, 5, () => { UseParalleFor(); });
CodeTimer.WriteDebug(
"并行foreach循环:"
, 5, () => { UserParalleForeach(); });
Console.Read();
}
6.运算结果:
可以看出,并行运算提高的性能还是比较明显的。
下面我们把GetData方法修改一下,把线程延迟的的代码去掉
/// <summary>
/// 获得数据
/// </summary>
/// <param name="i"></param>
/// <returns></returns>
private
static
int
GetData(
int
i)
{
// System.Threading.Thread.Sleep(100);
return
i;
}
再次运行
可以看出,这时候并行运算不但没降低消耗的时间,反而用了更多的时间。经过多次测试发现,采用并行运算跟程序的设计结构有很大的关系,如果设计不合理,反而会消耗更多时间。