为什么实时时间会低于用户时间

为什么实时时间会低于用户时间

我有一个转换视频文件的脚本,我在服务器上根据测试数据运行它并通过 测量其时间time。结果我看到:

real    2m48.326s
user    6m57.498s
sys     0m3.120s

为什么实时时间比用户时间低很多?这和多线程有什么关系吗?或者还有什么?

编辑:我认为该脚本运行了大约 2 分 48 秒

答案1

您显示的输出有点奇怪,因为实时通常会比其他两个更大。

  • Real时间是挂钟时间。 (我们可以用秒表测量)
  • Usertime 是进程内用户模式花费的时间量
  • 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/

http://man7.org/linux/man-pages/man1/time.1.html

相关内容