Сравнителен анализ - процесорното време е по-голямо от времето на стената?

Измервам времето на процесора и времето на стената на алгоритмите за сортиране на linux. Използвам getrusage за измерване на процесорно време и clock_gettime CLOCK_MONOTONIC за получаване на време на стена. Въпреки че забелязах, че времето на процесора е по-голямо от времето на стената - това правилно ли е? Винаги съм смятал, че процесорното време ТРЯБВА да е по-малко от времето на стената. Моите примерни резултати:

3.000187 seconds  [CPU]
3.000001 seconds  [WALL]

person mazix    schedule 24.07.2013    source източник
comment
Колко процесора са включени?   -  person Dan Pichelman    schedule 24.07.2013
comment
@DanPichelman: cat /proc/cpuinfo | grep processor | wc -l ми дава 2   -  person mazix    schedule 25.07.2013
comment
Но вашият код многонишков/многопроцесен ли е?   -  person Oliver Charlesworth    schedule 25.07.2013
comment
@OliCharlesworth: Дори и да не е многонишков, има само лек излишък и може да е бил таксуван за системни операции, които са били многонишкови.   -  person Eric Postpischil    schedule 25.07.2013
comment
@OliCharlesworth: не, това е само основно с някои функции/извиквания на таймери   -  person mazix    schedule 25.07.2013


Отговори (2)


Ако едно изчисление изисква две секунди процесорно време, тогава два процесора могат (в идеалния случай) да го извършат за една секунда. Следователно двупроцесорна система има две процесорни секунди за всяка секунда на стенен часовник. Дори ако не използвате изрично многопоточност във вашия процес, библиотеката, която използвате, или операционната система може да използва множество процесори, за да извършва работа за вашия процес.

Освен това част от счетоводството е приблизително. Една система може да проследява процесорното време в някаква малка единица, да речем микросекунди за целите на аргумента, и да таксува процес за микросекунда всеки път, когато процесът получи поне половин микросекунда процесорно време. (Което трябва да бъде урок за всички хора, които отговарят на въпроси с плаваща запетая с препоръки за използване на целочислена аритметика, за да се избегнат грешки при закръгляване. Всяка дискретна аритметика може да има грешки при закръгляване.)

person Eric Postpischil    schedule 24.07.2013

В зависимост от аргумента, който използвате, getrusage може да върне сумата от процесорното време във всички нишки във вашия процес. Ако имате повече от една нишка, това може да доведе до по-високо време на процесора от времето на стенния часовник.

Освен това, докато структурата на резултата съхранява стойностите в микросекунди, действителната прецизност може да е много по-ниска от тази, оттук и малкото несъответствие.

person Benawii    schedule 24.07.2013
comment
Използвам го така: getrusage(RUSAGE_SELF, &rus) и имам само една нишка: (int main(){//...}) - person mazix; 25.07.2013
comment
Тогава вероятно се дължи на ограничена точност на getrusage. Можете да опитате да стартирате програмата няколко пъти, за да видите как се променят и двете стойности. - person Benawii; 25.07.2013