为什么线程会增加 C# 的执行时间

php*_*net -3 c# multithreading

使用两个线程打印数字,这会增加时间,然后使用单循环打印我知道同步会增加时间,但在我的代码中如何增加时间并停止线程打印重复的数字?到底有吗?

class Program
{
    public static int count=0;
    public static List<string> numbers = new List<string>();
    public static int semaphore=0;

    static void Main(string[] args)
    {
        for (int i = 0; i < 10; i++)
        {
            numbers.Add(i.ToString());
        }

       Console.WriteLine("Before start thread");

       Thread tid1 = new Thread(new ThreadStart(MyThread.Thread1));
       Thread tid2 = new Thread(new ThreadStart(MyThread.Thread1));

       tid1.Start();
       tid2.Start();
    }
}
  public class MyThread
{
    public static object locker = new object();

    public static void Thread1()
    {
        for (; Program.count < Program.numbers.Count;)
        {
            lock (locker)
            {
                Console.WriteLine(Program.numbers[Program.count]);
                Program.count++;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

// 这比线程更快,为什么?

foreach (var item in numbers)
{
    Console.WriteLine(item);
}
Run Code Online (Sandbox Code Playgroud)

线程的平均时间为 1.5 毫秒,循环的平均时间为 0.6 毫秒

Ian*_*Ian 5

多线程并不能保证性能的提高。

首先,在多处理中真正重要的实际资源是并行处理单元的数量以及它们是否繁忙,而不是线程的数量。如果您的并行处理单元都很忙,或者如果

the number of thread > number of parallel processing unit
Run Code Online (Sandbox Code Playgroud)

那么创建更多线程会降低性能,而不是提高性能。

其次上下文切换因素。您拥有的线程越多,您进行上下文切换的频率可能就越高。因此,如果Thread与上下文切换时间相比,您的计算时间相对较短,那么多线程的性能会较差。

第三它还受到共享资源(或同步)因素的影响:您的共享资源是否经常被多个线程访问 - 它们需要相互等待,从而导致执行速度变慢

你的情况下,这似乎是第三种情况,正如@Peter提到的。这是因为您有count共享的全局变量(不是本地变量),并且必须由每个线程访问才能完成您的任务。也就是说,您的任务本质上是连续的。这使得多线程的执行时间比单线程的执行时间更差。

对于这种情况,如果您的任务本质上不是顺序的(即可以在收集结果之前拆分和独立完成),那么您可以期望使用多线程获得更好的结果,那么您可以尝试寻找执行您的Parallel.For任务。

例如:count每个线程都有本地变量,并在进程结束时对它们求和。