【发布时间】:2013-07-09 11:10:40
【问题描述】:
这段代码:
object obj = new object { };
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 90000; i++)
{
new Thread(() =>
{
lock (obj)
{
string file = new JavaScriptSerializer().Serialize(saeed);
File.AppendAllText(string.Format(@"c:\Temp\{0}.txt", i), file);
}
}).Start();
}
watch.Stop();
运行大约 15 分钟,而这段代码:
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 90000; i++)
{
{
string file = new JavaScriptSerializer().Serialize(saeed);
File.AppendAllText(string.Format(@"c:\Temp\{0}.txt", i), file);
}
}
watch.Stop();
运行时间大约为 45 秒。为什么第一个应用程序在线程化时要慢得多?使用线程不是提高应用程序性能的一种技术吗?
更新:即使在我的线程中使用闭包概念并引用中间变量而不是 i 而不是使用锁,这使得线程真正异步,创建这些文件仍然需要超过 5分钟。
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 90000; i++)
{
var x = i;
new Thread(() =>
{
string file = new JavaScriptSerializer().Serialize(saeed);
File.AppendAllText(string.Format(@"c:\Temp\{0}.txt", i), file);
}).Start();
}
watch.Stop();
【问题讨论】:
-
如果你添加一个巨大的
lock块,那么多线程是没有意义的...... -
因为每次迭代都会创建新线程
-
您每次都在启动新线程。每个线程都有相同的同步。您也可以编写一个正常的 for 循环,最后再添加几个零。 CPU 旋转了很长时间,等待你的锁被释放。
-
将线程视为“提高应用程序性能的技术”是非常危险的。
-
去掉锁,然后用
Enumerable.Range(0,90000).AsParallel().ForAll( i=> { Contents of task});替换你的for
标签: c# multithreading performance