多线程肯定能提高性能吗
Can multi-threading improve the performance definitely
我正在使用 C++11 开发一个项目。
在某些函数中,我得到了一些并行任务,如下所示:
void func() {
auto res1 = task1();
auto res2 = task2();
auto res3 = task3();
...
std::cout << res1 + res2 + res3 + ...;
}
嗯,每个任务有点重,假设每个任务花费 300ms。
现在我在想,让每个任务都成为一个 std::thread
应该会提高性能。
但据我了解,是 OS 安排线程。 我不确定 OS 是否确保它会立即执行这些线程 或者它可能需要等待其他一些东西?
所以我的问题是,让任务多线程化是否一定可以提高性能,或者在某些情况下,这种方法会获得更差的性能?
顺便说一句,我知道太多的线程会因为上下文切换而导致非常糟糕的性能,在我的真实情况下,任务的计数小于 10,并且它们不共享任何数据。
I'm not sure if the OS ensures that it will execute these threads
immediately or it may need to wait for some other stuff?
OS 将尝试尽快启动线程。不能保证它们在 thread
对象的构造函数 returns 的确切时刻已经是 运行,但是 OTOH OS 不会在启动它们之前故意等待, 任何一个。 (例如,在负载不是很严重的系统上,您通常可以预期它们会在几毫秒内达到 运行)
So my question is if making the tasks multi-threading can definitely
improve the performance, or in some cases, this method would get a
worse performance?
向程序添加多线程并发现您的程序实际上比单线程版本需要更长的时间才能完成,这实际上是一种相当普遍的经历,尤其是对于刚接触多线程编程的程序员。
这类似于在厨房里增加更多的厨师——如果厨师们合作得好并且彼此远离,他们可以在更短的时间内烹制更多的食物,但如果他们不这样做,他们可能会他们大部分时间都在等待彼此完成使用各种 tools/ingredients,或者讨论谁应该做什么,结果比一个厨师做的还慢。
一般来说,多线程可以加快速度,如果你是运行多核系统,和你的各个线程不需要相互通信彼此太多,和线程不需要太频繁地获得对共享资源的独占访问,和你的线程没有做任何事情效率极低(如密集轮询或忙等待)。这些条件是容易实现还是难以实现在很大程度上取决于您要完成的任务。
我正在使用 C++11 开发一个项目。
在某些函数中,我得到了一些并行任务,如下所示:
void func() {
auto res1 = task1();
auto res2 = task2();
auto res3 = task3();
...
std::cout << res1 + res2 + res3 + ...;
}
嗯,每个任务有点重,假设每个任务花费 300ms。
现在我在想,让每个任务都成为一个 std::thread
应该会提高性能。
但据我了解,是 OS 安排线程。 我不确定 OS 是否确保它会立即执行这些线程 或者它可能需要等待其他一些东西?
所以我的问题是,让任务多线程化是否一定可以提高性能,或者在某些情况下,这种方法会获得更差的性能?
顺便说一句,我知道太多的线程会因为上下文切换而导致非常糟糕的性能,在我的真实情况下,任务的计数小于 10,并且它们不共享任何数据。
I'm not sure if the OS ensures that it will execute these threads immediately or it may need to wait for some other stuff?
OS 将尝试尽快启动线程。不能保证它们在 thread
对象的构造函数 returns 的确切时刻已经是 运行,但是 OTOH OS 不会在启动它们之前故意等待, 任何一个。 (例如,在负载不是很严重的系统上,您通常可以预期它们会在几毫秒内达到 运行)
So my question is if making the tasks multi-threading can definitely improve the performance, or in some cases, this method would get a worse performance?
向程序添加多线程并发现您的程序实际上比单线程版本需要更长的时间才能完成,这实际上是一种相当普遍的经历,尤其是对于刚接触多线程编程的程序员。
这类似于在厨房里增加更多的厨师——如果厨师们合作得好并且彼此远离,他们可以在更短的时间内烹制更多的食物,但如果他们不这样做,他们可能会他们大部分时间都在等待彼此完成使用各种 tools/ingredients,或者讨论谁应该做什么,结果比一个厨师做的还慢。
一般来说,多线程可以加快速度,如果你是运行多核系统,和你的各个线程不需要相互通信彼此太多,和线程不需要太频繁地获得对共享资源的独占访问,和你的线程没有做任何事情效率极低(如密集轮询或忙等待)。这些条件是容易实现还是难以实现在很大程度上取决于您要完成的任务。