【发布时间】:2010-12-16 21:00:54
【问题描述】:
这是一段 C# 代码,它对双精度矩阵的每一行(假设为 200x200)应用一个操作。
For (int i = 0; i < 200; i++)
{
result = process(row[i]);
DoSomething(result);
}
进程是一个静态方法,我有一个Corei5 CPU和Windows XP em>,我正在使用 .Net Framework 3.5。为了获得性能,我尝试使用单独的线程(使用异步委托)处理每一行。于是我将代码改写如下:
List<Func<double[], double>> myMethodList = new List<Func<double[], double>>();
List<IAsyncResult> myCookieList = new List<IAsyncResult>();
for (int i = 0; i < 200; i++)
{
Func<double[], double> myMethod = process;
IAsyncResult myCookie = myMethod.BeginInvoke(row[i], null, null);
myMethodList.Add(myMethod);
myCookieList.Add(myCookie);
}
for (int j = 0; j < 200; j++)
{
result = myMethodList[j].EndInvoke(myCookieList[j]);
DoSomething(result);
}
此代码在一次运行中被调用 1000 个矩阵。当我测试时,令人惊讶的是我没有得到任何性能提升!所以这给我带来了这个问题,在什么情况下多线程将有利于性能提升,而且我的代码是否合乎逻辑?
【问题讨论】:
-
它是哪个 Core i5?可用线程的数量受到限制,具体取决于它是哪个芯片。此外,我认为您不会看到大幅增长,但我很惊讶您说您没有任何改善。
-
当执行时间超过一秒时,您应该能够使用 TaskManager 来判断是否所有内核都在使用。
标签: c# multithreading performance asynchronous delegates