【发布时间】:2012-09-05 14:36:35
【问题描述】:
我有以下代码(控制台应用程序的“Program.cs”的完整内容)。 'countUp' 到 'countUp4' 的单线程执行需要 13 秒,多线程执行需要 21 秒..
我有一个 Intel Core i5-2400 @ 3.10 GHz、8 GB 内存、Windows 7 64 位。那么为什么多线程执行比单线程慢呢?
多线程是否只对不阻塞简单 c# 应用程序的主程序有用?多线程在什么时候给我带来了执行速度的优势?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static int counter = 0;
static int counter2 = 0;
static int counter3 = 0;
static int counter4 = 0;
static void Main(string[] args)
{
Console.WriteLine("Without multithreading:");
Console.WriteLine("Start:" + DateTime.Now.ToString());
countUp();
countUp2();
countUp3();
countUp4();
Console.WriteLine("");
Console.WriteLine("With multithreading:");
Console.WriteLine("Start:" + DateTime.Now.ToString());
Thread thread1 = new Thread(new ThreadStart(countUp));
thread1.Start();
Thread thread2 = new Thread(new ThreadStart(countUp2));
thread2.Start();
Thread thread3 = new Thread(new ThreadStart(countUp3));
thread3.Start();
Thread thread4 = new Thread(new ThreadStart(countUp4));
thread4.Start();
Console.Read();
}
static void countUp()
{
for (double i = 0; i < 1000000000; i++)
{
counter++;
}
Console.WriteLine(counter.ToString());
Console.WriteLine(DateTime.Now.ToString());
}
static void countUp2()
{
for (double i = 0; i < 1000000000; i++)
{
counter2++;
}
Console.WriteLine(counter2.ToString());
Console.WriteLine(DateTime.Now.ToString());
}
static void countUp3()
{
for (double i = 0; i < 1000000000; i++)
{
counter3++;
}
Console.WriteLine(counter3.ToString());
Console.WriteLine(DateTime.Now.ToString());
}
static void countUp4()
{
for (double i = 0; i < 1000000000; i++)
{
counter4++;
}
Console.WriteLine(counter4.ToString());
Console.WriteLine(DateTime.Now.ToString());
}
}
}
【问题讨论】:
-
我很惊讶这甚至可以工作......你不是从后台访问 UI 线程吗?这是实际的代码吗?
-
这里没什么普通的。控制台可能(这只是我的猜测)需要同步,因此所有线程都在相互等待。多线程自动更快,这是一个普遍存在的错误信息。你必须处理同步、上下文切换等等。
-
首先,DateTime.Now 是一种糟糕的计时方式,请改用
Stopwatch类。其次,并非所有代码都能从多线程中受益。 -
@Killercam 什么 UI 线程?这是一个控制台应用程序
-
其实Console已经同步了。
标签: c# multithreading performance