多线程比单线程慢

本文关键字:单线程 多线程 | 更新日期: 2023-09-27 18:15:12

我有一个执行矩阵乘法的程序。我有多线程和单线程版本。多线程版本比单线程慢,我不知道为什么。你能给我解释一下吗?

多线程(for size = 128,秒表显示大约5秒):

private static SemaphoreSlim semaphore = new SemaphoreSlim(size, size);
(...)
for (int i = 0; i < size; i++)
{
    threads[i] = new Thread(() => Multiply(ref a, ref b, ref c));
    threads[i].Name = i.ToString();
    threads[i].Start();
}
for (int i = 0; i < size; i++)
    threads[i].Join();
(...)
public static void Multiply(ref float[,] a, ref float[,] b, ref float[,] c)
{
    int index = int.Parse(Thread.CurrentThread.Name);
    semaphore.Wait();
    for (int j = 0; j < c.GetLength(0); j++)
        for (int k = 0; k < c.GetLength(0); k++)
            c[index, j] += a[index, k] * b[k, j];
    semaphore.Release();
}

单线程(for size = 128,秒表显示在3秒):

for (int i = 0; i < size; i++)
    Multiply(i, ref a, ref b, ref c);
(...)   
public static void Multiply(int i, ref float[,] a, ref float[,] b, ref float[,] c)
{
    for (int j = 0; j < c.GetLength(0); j++)
        for (int k = 0; k < c.GetLength(0); k++)
            c[i, j] += a[i, k] * b[k, j];
}

多线程比单线程慢

这并不罕见。线程,特别是线程同步,往往会增加很多开销。这就是为什么需要仔细考虑多线程,以及为什么异步而非多线程方法通常是正确的答案。

如果您正在执行CPU繁重的任务,通常最好在一个或少数工作线程上完成它们,这样它们就不会不停地相互抢占。通常情况下,一旦cpu限制的线程数量超过了处理器的可用内核,就不会获得性能提升,实际上还会降低性能。

想象一下,试着让一群幼儿园的孩子穿过一扇门去休息。实际上,让他们排好队,有序地通过比让他们互相推挤,争先通过要快得多。

即使在你的线程争夺CPU时间之前,如果线程占用更多的时间,线程仍然会减慢你的速度。比并行化任务获得的同步开销更大。

多线程并不总是比单线程更快。创建线程和同步的额外偷听可能会大大增加解决问题所需的时间。此外,还有其他因素可能会对多线程工作,如您的CPU有多少内核(越低的多线程性能越差)。