LINUX.ORG.RU

Вероятно столько времени надо, что-бы вывести «real 2m26.443s», или что-то типа того

vasily_pupkin ★★★★★
()
Ответ на: комментарий от fraxinum

Накопал хороший пример с интернетов.

/*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 */

user@machine:~$ gcc a.c -lpthread

$ time ./a.out

real    0m7.415s
user    0m13.105s
sys     0m0.032s

fraxinum
()
Ответ на: комментарий от fraxinum

Вообще такое бывает при многопоточности.

Задачи в принципе однопоточные. И всё равно непонятно, как затраченное CPU время (особенно при sys==0) может быть больше, чем время между началом и концом измерения :)

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от fraxinum

Не, тут, как раз, всё понятно, многопоточная система.

KRoN73 ★★★★★
() автор топика
Ответ на: комментарий от KRoN73

Опять же - все еще пишут что user будет общим результатом, на все ядра.

Ну и капитанство с вики:

The term «real time» in this context refers to elapsed «wall clock» time, like using a stop watch. The total CPU time (user time + sys time) may be more or less than that value. Because a program may spend some time waiting and not executing at all (whether in user mode or system mode) the real time may be greater than the total CPU time. Because a program may fork children whose CPU times (both user and sys) are added to the values reported by the time command, the total CPU time may be greater than the real time.

fraxinum
()

Если это встроенная в bash команда time, то там не тривиальная арифметика, там не только время самой команды, но и время bash, истраченное на time суммируются. Bash дважды вызывает getrusage() для RUSAGE_SELF и RUSAGE_CHILDREN перед и после fork(), а потом выводит сумму от разницы до и после fork.

В общем, попробуйте:

strace -v -e trace=process -e trace=getrusage /bin/bash -c "time ПРОГРАММА"

По идее, первый getrusage(RUSAGE_CHILDREN, ...) в структурах ru_utime и ru_stime будет содержать нули, а второй времена для этой программы.

Ну, и даже однопоточная программа может дёргать библиотечный вызов, который сделает её многопоточной или запустит дочерний процесс.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.