我有一个转换视频文件的脚本,我在服务器上根据测试数据运行它并通过 测量其时间time
。结果我看到:
real 2m48.326s
user 6m57.498s
sys 0m3.120s
为什么实时时间比用户时间低很多?这和多线程有什么关系吗?或者还有什么?
编辑:我认为该脚本运行了大约 2 分 48 秒
答案1
您显示的输出有点奇怪,因为实时通常会比其他两个更大。
Real
时间是挂钟时间。 (我们可以用秒表测量)User
time 是进程内用户模式花费的时间量Sys
是进程内内核花费的 CPU 时间。
所以我想如果工作是由多个处理器同时完成的,CPU 时间将高于所用的挂钟时间。
这是并发/多线程/并行类型的应用程序吗?
举个例子,这是我发出命令时在 Linux 系统上得到的结果time find .
。正如预期的那样,real
在这个单用户/单核心进程上,所花费的时间比其他进程要长得多。
real 0m5.231s
user 0m0.072s
sys 0m0.088s
经验法则是:
- real < user:进程受 CPU 限制,并利用多核/CPU 上的并行执行。
- real ≈ user:该进程受 CPU 限制,并且不利用并行执行。
- real > user:进程受 I/O 限制。在多个核心上执行几乎没有优势。
答案2
只是为了说明所说的内容,用两个线程进程进行一些计算。
/*a.c/*
#include <pthread.h>
static void * dosomething () {
unsigned long a,b=1;
for (a=1000000000; a>0; a--) b*=3;
return NULL;
}
main () {
pthread_t one, two;
pthread_create(&one,NULL, dosomething, NULL);
pthread_create(&two,NULL, dosomething, NULL);
pthread_join (one, NULL);
pthread_join (two, NULL);
}
/* end of a.c */
编译
gcc a.c -lpthread
(这只是为了说明,在现实生活中我应该添加 -D_REENTRANT 标志)
$ time ./a.out
real 0m7.415s
user 0m13.105s
sys 0m0.032s
(时间是在具有两个慢速核心的 Intel Atom 上:))
答案3
它不需要是多线程程序;您可以通过多个进程获得相同的效果。我编写了一个 C 程序来进行一些简单的数字运算:
$ time ./runner
real 1m12.746s
user 1m12.493s
sys 0m0.015s
然后我编写了一个脚本来运行该进程的两个副本:
$ cat run_script
#!/bin/sh
./runner &
./runner &
wait
$ time ./run_script
real 1m31.231s
user 3m0.538s
sys 0m0.215s
答案4
正如莱文所说:
我有一个 i7(8 个处理器),所以如果运行bash
:
$ time for ((i=0;i<1000000;i++)); do echo $i; done | wc -l
1000000
real 0m4,878s
user 0m4,368s
sys 0m3,083s
然后如果将 bash 限制为一个进程taskset -cp 0 $BASHPID
$ taskset -cp 0 $BASHPID
pid 30551's current affinity list: 0-7
pid 30551's new affinity list: 0
现在的结果是
$ time for ((i=0;i<1000000;i++)); do echo $i; done | wc -l
1000000
real 0m7,120s
user 0m4,282s
sys 0m2,824s
https://www.looklinux.com/how-to-run-process-or-program-on-specific-cpu-cores-in-linux/