Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 单核上的多线程_Multithreading_Performance_Factorial - Fatal编程技术网

Multithreading 单核上的多线程

Multithreading 单核上的多线程,multithreading,performance,factorial,Multithreading,Performance,Factorial,如果我把一个阶乘程序分成两个线程。一个计算偶数到100的阶乘,另一个计算奇数。在单核处理器的执行时间内,我可以期望哪些性能改进?您不能期望任何性能改进。事实上,您应该期望程序的运行速度明显低于单线程版本 多线程通常会使程序运行得更慢,而不是更快。我们愿意支付罚款有两个原因: 1我们可以使用多线程作为并行使用多核机器处理器的一种方式,从而加快大型计算 我知道,我说过线程会让事情变慢。嗯,那是真的。如果您使用两个线程和两个CPU内核实现并行计算,它的运行速度将比单线程版本快一倍还慢,但希望仍然比在一

如果我把一个阶乘程序分成两个线程。一个计算偶数到100的阶乘,另一个计算奇数。在单核处理器的执行时间内,我可以期望哪些性能改进?

您不能期望任何性能改进。事实上,您应该期望程序的运行速度明显低于单线程版本

多线程通常会使程序运行得更慢,而不是更快。我们愿意支付罚款有两个原因:

1我们可以使用多线程作为并行使用多核机器处理器的一种方式,从而加快大型计算

我知道,我说过线程会让事情变慢。嗯,那是真的。如果您使用两个线程和两个CPU内核实现并行计算,它的运行速度将比单线程版本快一倍还慢,但希望仍然比在一个内核上运行一个线程的速度快。如果不是,那么四核上的四个线程或八核上的八个线程可能会比单线程版本快

2我们可以使用多线程简化实时和软实时程序的设计。实时和软实时程序通常必须响应多个或多个不同的非同步输入。与在大循环中轮询每个不同输入的事件驱动程序相比,让不同的线程等待每个输入可以使程序更易于阅读


它更容易阅读,因为与每个独立输入相关联的状态变量可以保存在局部变量中,这是大多数程序员熟悉的习惯用法。当然,更容易阅读并不意味着更容易写作。。。没有细微的错误,但这是另一天的主题。

如果允许并发使用资源,多线程通常会提高速度,否则其中一些资源至少会有一部分时间处于空闲状态

例如,如果您有一个进程从磁盘读取一些数据,对其进行大量处理,然后将结果写回磁盘,那么即使在单核系统上,您也可以或多或少地同时执行磁盘I/O和计算,从而获得一些好处

即使在这样的情况下,您通常在程序的每个部分都会遇到至少一点缓慢。但是,让我们假设您正在进行足够的处理,所需的时间与阅读和写作的总时间大致相同

磁盘I/O几乎以独占方式使用一组资源,而计算几乎以独占方式使用另一组资源。使用两个线程可能会增加(比如说)1%的时间,但是通过同时执行磁盘I/O和计算,您可以获得双倍的速度,减去1%的开销,因此您的程序运行多线程所需的时间大约是单线程的51%


然而,在您的例子中,您所说的两个线程做完全相同的事情,因此它们竞争使用完全相同的资源。这意味着您没有做任何事情来加速计算本身,您至少增加了一些开销来在两个线程的执行之间切换。因此,多线程代码几乎肯定会比单线程代码运行得慢,通常不会太近,但无论如何都会慢一点。

我认为这不是解决这个问题的正确位置。是的,这是。访问I/O是单核上多线程的典型工作—允许一个活动线程执行计算密集型工作。