在某些 unix shell 中,有一个time
命令可以打印给定命令执行所需的时间。输出看起来像
真实 1m0.000s
用户 10m0.000s
系统 0m0.000s
如果我编写一个在多核上使用并行化的程序,用户时间可以是实时的倍数。
我的问题是,我是否可以得出结论,如果用户时间非常接近实时乘以所用线程数,那么程序是最佳并行化的吗?也就是说,例如没有线程必须为其他线程等待很长时间。
在某些 unix shell 中,有一个time
命令可以打印给定命令执行所需的时间。输出看起来像
真实 1m0.000s
用户 10m0.000s
系统 0m0.000s
如果我编写一个在多核上使用并行化的程序,用户时间可以是实时的倍数。
我的问题是,我是否可以得出结论,如果用户时间非常接近实时乘以所用线程数,那么程序是最佳并行化的吗?也就是说,例如没有线程必须为其他线程等待很长时间。
一言以蔽之:不。
最费力气的是内核空间和用户空间的切换,这种切换是产生最多浪费的地方。有(很多)工作只是为了到达需要执行实际操作的地方。所需的开关越少,操作的效率就应该越高。
有些操作完全在内核空间中完成(并且没有(安全的)方法可以绕过它)。在这种情况下,大部分时间花在内核空间上,这是执行它们的最有效方式。
由于内核没有实现它的服务/功能,因此必须在用户空间中执行其他操作。在这样的操作中,在用户空间中使用的时间越多,操作的效率就越高。
但是有人可能已经使用一些不太高效的算法在用户空间中实现了高效的内核服务。这将增加用户时间,但结果会降低效率。与内核空间中的相同服务相比。
而其他一些开发人员可能会调用内核一次读取一个字节(并且必须为每个字节进行切换)而不是一次读取一个兆字节的等效调用(如果有一个块的等效函数而不是一个字节)。
而且,最终,一定会执行一些内核和用户操作的混合。例如,要读取一个磁盘块,内核应该提供函数并且它应该是“即发即弃”,直到内存块(缓冲区)被磁盘块读取的结果填满。要访问进程内存(如程序数组),不需要内核调用。
没有简单的方法来衡量时间效率。