Ваш сценарий очень неэффективен, требуя от множества отдельных процессов, чтобы каждый получил некоторое время ЦП, прежде чем он сможет запустить следующую sleep .1
, так что да, загрузка системы заставит его запускаться реже.
Кроме того, sensors
является относительно дорогим;возможно используйте параметры командной строки, чтобы он проверял только температуру процессора.Или я думаю, что температура процессора доступна из файлов в /proc
или /sys
напрямую.
xargs
без аргументов по умолчанию echo
, так что это просто неэффективный способ свернуть пробельные символы(включая перевод строки) на пробелы.(Если вы используете printf '%s\n' foo bar | strace -f xargs
, вы можете увидеть, что он на самом деле выполняет fork + execve /bin/echo
вместо простой печати самого вывода, как вы могли бы сделать с sed
или tr
.)
, вы можете использовать большеэффективные команды для обработки текста, которые требуют меньше процессорного времени и меньше переключений контекста, пропуская меньше отдельных процессов.Например, sensors
передается в одну команду awk
, которая выполняет всю обработку текста.И sed -n 's/cpu MHz : //p' /proc/cpuinfo >> frequency.dat
, чтобы избежать бесполезного использования cat (и xargs).
Но это все еще будет иметь некоторые накладные расходы.
Вы могли бы написать один perl
скрипт, который передает с sensors
и закрывает / открывает /proc/cpuinfo
. . Это позволит избежать всех системных вызовов, которые выполняет запуск процесса.
Вместо того, чтобы спать в течение фиксированного времени, вы можетепусть он проверяет текущее время и спит до следующего кратного 0.1
секунд. Вы можете сделать это и с помощью bash, но для этого потребуется выполнить еще больше команд, и вы захотите вызвать как можно меньше переключений контекста дляВаш эталонный тест.
Вы также можете или вместо этого пометить каждую строку текущим временем, чтобы вы знали, когда пришел каждый образец.Чтобы сделать это без необходимости запуска другого внешнего процесса, используйте команду bash $EPOCHREALTIME
.Например, { echo -n "$EPOCHREALTIME "; awk ...; } >> cpuf.dat
, если вы все еще используете bash вместо Perl.