![最佳用户时间与实时比率是高效并行化的指标吗?](https://linux22.com/image/137202/%E6%9C%80%E4%BD%B3%E7%94%A8%E6%88%B7%E6%97%B6%E9%97%B4%E4%B8%8E%E5%AE%9E%E6%97%B6%E6%AF%94%E7%8E%87%E6%98%AF%E9%AB%98%E6%95%88%E5%B9%B6%E8%A1%8C%E5%8C%96%E7%9A%84%E6%8C%87%E6%A0%87%E5%90%97%EF%BC%9F.png)
在某些 UNIX shell 中,有一个time
命令可以打印执行给定命令所需的时间。输出看起来像
真实 1m0.000s
用户 10m0.000s
系统 0m0.000s
如果我编写一个在多核上使用并行化的程序,则用户时间可以是实时时间的倍数。
我的问题是,我是否可以得出结论,如果用户时间非常接近实时乘以所使用的线程数,则程序的并行化效果最佳?也就是说,例如没有线程必须长时间等待其他线程。
答案1
用一个简单的词来说:不。
浪费大量精力的是内核空间和用户空间之间的切换,这种切换是产生浪费最多的地方。为了到达需要执行实际操作的位置,需要完成(大量)工作。所需开关越少,操作效率最高应该是。
有些操作完全在内核空间中完成(并且没有(安全)方法可以绕过它)。在这种情况下,大部分时间都花在内核空间上,这是执行它们的最有效方法。
还有其他操作必须在用户空间中执行,因为内核没有实现它的服务/功能。在此类操作中,用户空间使用的时间越多,操作的效率就越高。
但有人可能使用一些不太高效的算法在用户空间中实现了高效的内核服务。这会增加用户时间,但结果会降低效率。与内核空间中的相同服务进行比较。
其他一些开发人员可能会调用内核一次读取一个字节(并且必须为每个字节进行切换),而不是一次读取一个兆的等效调用(如果有一个块的等效函数而不是一个块)字节)。
并且,最终一定会执行一些内核和用户操作的混合。例如,要读取磁盘块,内核应该提供该函数,并且它应该是“即发即忘”,直到内存块(缓冲区)被磁盘块读取的结果填充为止。要访问进程内存(如程序数组),不需要内核调用。
没有简单的方法来衡量时间效率。