[Moscow.pm] Распределение user и system time для пустого цикла

Ilya Chesnokov chesnokov.ilya на gmail.com
Чт Фев 21 07:44:55 PST 2019


Похоже, уже нашёл ответ... :-)

https://perl5.git.perl.org/perl.git/commit/78462dd3f2a26a5a5f9ec040277bad147e6c5d52

Разрабы специально добавили в цикл какую-то работу, чтобы user time
менялся быстрее. Но у меня perl более старый.

чт, 21 февр. 2019 г. в 18:34, Ilya Chesnokov <chesnokov.ilya на gmail.com>:
>
> Всем привет.
>
> Недавно заметил, что на моей виртуальной машине с FreeBSD
> 10.4-RELEASE-p13, работающей под VirtualBox, запущенным под Linux
> (4.18.0-15-generic #16-Ubuntu SMP), творятся странные вещи.
>
> Любой код, использующий модуль Benchmark (в том числе тесты для
> некоторых CPAN-модулей, например DBIx::Class, Devel::NYTProf) на 100%
> загружают CPU и вообще выполняется очень долго. После некоторого
> исследования обнаружилось, что причиной тому - вот эта вот строчка:
> https://metacpan.org/source/SHAY/perl-5.28.1/lib/Benchmark.pm#L718
> Т.е., Benchmark ждет, пока изменится user time, и только после этого
> продолжает работать.
>
> Почему-то на моей виртуалке такая вот "пустая" операция, какой
> является Benchmark->new() занимает очень мало user time и очень много
> system time. При этом на хост-системе они приблизительно равны или
> user time даже больше. Для определения этого я написал вот такой
> однострочник:
>
> time perl -E '$|++; $SIG{ALRM} = sub { die "alarm\n"; }; alarm 1; say
> join " ", times while 1'
>
> На виртуалке последняя строчка примерно такая: 0.015625 0.9921875 0 0
> На хост-машине такая: 0.62 0.38 0 0
>
> Т.е. видно, что на виртуалке для пустого цикла user time почти не
> меняется, что приводит к долгому прогону цикла в модуле Benchmark.
>
> Есть идеи, почему это так, и как это исправить?
>
> --
> Best regards,
> Ilya Chesnokov



-- 
Best regards,
Ilya Chesnokov


Подробная информация о списке рассылки Moscow-pm