У меня есть несколько вариантов программы, которые я хочу сравнить по производительности. Оба выполняют, по сути, одну и ту же задачу.
Все это делается на C и в памяти. Другой вызывает внешнюю утилиту и выполняет файловый ввод-вывод.
Как мне их достоверно сравнить?
1) Получение «времени на CPU» с помощью «time» отдает предпочтение второму варианту для вызова system () и выполнения операций ввода-вывода. Даже если я добавлю «системное» время к «пользовательскому», оно все равно не будет учитываться как время, заблокированное функцией wait ().
2) Я не могу просто отсчитывать их, потому что они работают на сервере и могут быть отключены от процессора в любое время. Усреднение по тысячам экспериментов - мягкий вариант, поскольку я понятия не имею, как используется мой сервер - это виртуальная машина в кластере, это довольно сложно.
3) профилировщики не помогают, так как они дают мне время, потраченное на код, что опять же в пользу версии, которая выполняет system ()
Мне нужно рекурсивно суммировать все процессорное время, которое потребляют эти программы, включая пользователя, ядро, ввод-вывод и дочерние элементы.
Я ожидал, что это обычная проблема, но все еще не нашел решения.
(Решено с помощью times () - см. Ниже. Всем спасибо)





Если я понял, ввод «time myapplication» в командной строке bash - это не то, что вы ищете.
Если вам нужна точность, вы должны использовать профилировщик ... У вас есть исходный код, да?
Попробуйте что-нибудь вроде Опрофайл или Валгринд, или посмотрите это для более расширенного списка.
Если у вас нет источника, честно говоря, я не знаю ...
Выполните их тысячу раз, измерьте фактически затраченное время, а затем усредните результаты. Это должно сгладить любые отклонения, связанные с другими приложениями, работающими на вашем сервере.
Я бы, вероятно, склонялся к добавлению «time -o somefile» в начало системной команды, а затем добавлял бы его ко времени, заданному временем вашей основной программы, чтобы получить итог. Если мне не приходилось делать это много раз, я бы нашел способ взять два вывода времени и добавить их на экран (используя awk, оболочку, perl или что-то еще).
/ usr / bin / time (не встроенное в bash "время") может дать некоторую интересную статистику.
$ /usr/bin/time -v xeyes
Command being timed: "xeyes"
User time (seconds): 0.00
System time (seconds): 0.01
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:04.57
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 0
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 9
Minor (reclaiming a frame) page faults: 517
Voluntary context switches: 243
Involuntary context switches: 0
Swaps: 0
File system inputs: 1072
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
не дает мне детское время, но все равно полезно
Кажется, я наконец его нашел.
ИМЯ раз - получить время обработки
ОБЗОР #включают
clock_t times(struct tms *buf);
ОПИСАНИЕ times () сохраняет текущее время процесса в структуре tms, которая buf указывает на. Структура struct tms определена в:
struct tms {
clock_t tms_utime; /* user time */
clock_t tms_stime; /* system time */
clock_t tms_cutime; /* user time of children */
clock_t tms_cstime; /* system time of children */
};
Время детей - это рекурсивная сумма всех ожидаемых детей.
Интересно, почему она еще не стала стандартной утилитой CLI. Или, может быть, я просто невежественен.
эм, я думаю, что times - это команда, включенная в bash. Можно сказать, что это стандартный интерфейс командной строки.
это сработает на один шаг вниз по вилочной цепи. Если моя внешняя команда запускает еще детей - чего я не знаю - я получу неверные результаты