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,并在开始时初始化
1
public
static
IList
<
int
>
Datas
=
new
List
<
int
>
();
2
3
static
void
Main(
string
[] args)
4
{
5
InitializeData();
6
7
8
Console.Read();
9
}
10
11
///
<summary>
12
///
初始化数据
13
///
</summary>
14
private
static
void
InitializeData()
15
{
16
Datas.Clear();
17
for
(
int
i
=
0
; i
<
20
; i
++
)
18
{
19
Datas.Add(i);
20
}
21
}
22
2.设计耗时的方法,并来在各种运算方式中调用
1
///
<summary>
2
///
获得数据
3
///
</summary>
4
///
<param name="i"></param>
5
///
<returns></returns>
6
private
static
int
GetData(
int
i)
7
{
8
System.Threading.Thread.Sleep(
100
);
9
return
i;
10
}
11
3. 设计一般的运算方式,调用GetData方法
1
///
<summary>
2
///
采用一般for循环
3
///
</summary>
4
private
static
void
UseFor()
5
{
6
for
(
int
i
=
0
; i
<
20
; i
++
)
7
{
8
GetData(Datas[i]);
9
}
10
}
11
12
///
<summary>
13
///
采用一般的foreach
14
///
</summary>
15
private
static
void
UseForeach()
16
{
17
foreach
(var item
in
Datas)
18
{
19
GetData(item);
20
}
21
}
22
4.采用并行运算的方式,调用GetData方法
1
///
<summary>
2
///
采用并行for循环
3
///
</summary>
4
private
static
void
UseParalleFor()
5
{
6
Parallel.For(
0
,
20
, (i)
=>
7
{
8
GetData(Datas[i]);
9
});
10
11
}
12
13
///
<summary>
14
///
采用并行的foreach
15
///
</summary>
16
private
static
void
UserParalleForeach()
17
{
18
Parallel.ForEach(Datas, (t)
=>
{ GetData(t); });
19
}
20
5.最后采用老赵设计的CodeTimer来比较每一种运算方式的耗时,在Main函数中加入测试代码
1
static
void
Main(
string
[] args)
2
{
3
InitializeData();
4
5
CodeTimer.Initialize();
6
CodeTimer.WriteDebug(
"
一般for循环:
"
,
5
, ()
=>
{ UseFor(); });
7
CodeTimer.WriteDebug(
"
一般foreach循环:
"
,
5
, ()
=>
{ UseForeach(); });
8
CodeTimer.WriteDebug(
"
并行for循环:
"
,
5
, ()
=>
{ UseParalleFor(); });
9
CodeTimer.WriteDebug(
"
并行foreach循环:
"
,
5
, ()
=>
{ UserParalleForeach(); });
10
11
Console.Read();
12
}
13
6.运算结果:
可以看出,并行运算提高的性能还是比较明显的。
下面我们把GetData方法修改一下,把线程延迟的的代码去掉
1
///
<summary>
2
///
获得数据
3
///
</summary>
4
///
<param name="i"></param>
5
///
<returns></returns>
6
private
static
int
GetData(
int
i)
7
{
8
//System.Threading.Thread.Sleep(
100
);
9
return
i;
10
}
再次运行
可以看出,这时候并行运算不但没降低消耗的时间,反而用了更多的时间。经过多次测试发现,采用并行运算跟程序的设计结构有很大的关系,如果设计不合理,反而会消耗更多时间。