gpt4 book ai didi

c# - 多线程比单线程慢

转载 作者:太空宇宙 更新时间:2023-11-03 21:07:28 25 4
gpt4 key购买 nike

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

多线程(对于大小 = 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();
}

单线程(对于大小 = 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 限制的线程数超过处理器的可用内核,通常不会有任何性能提升 - 实际上会影响性能。

想象一下,试图让一个满是幼儿园学生的类(class)通过一扇门去休息。实际上,让他们排成一行并让他们有序通过比让他们互相推开并争先通过要快得多。

即使在您的线程争夺 CPU 时间之前,如果线程和同步开销花费的时间比您通过并行化任务获得的时间更多,线程仍然会减慢您的速度。

关于c# - 多线程比单线程慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40289251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com