Скорость программы профиля в Linux

У меня есть несколько вариантов программы, которые я хочу сравнить по производительности. Оба выполняют, по сути, одну и ту же задачу.

Все это делается на C и в памяти. Другой вызывает внешнюю утилиту и выполняет файловый ввод-вывод.

Как мне их достоверно сравнить?

1) Получение «времени на CPU» с помощью «time» отдает предпочтение второму варианту для вызова system () и выполнения операций ввода-вывода. Даже если я добавлю «системное» время к «пользовательскому», оно все равно не будет учитываться как время, заблокированное функцией wait ().

2) Я не могу просто отсчитывать их, потому что они работают на сервере и могут быть отключены от процессора в любое время. Усреднение по тысячам экспериментов - мягкий вариант, поскольку я понятия не имею, как используется мой сервер - это виртуальная машина в кластере, это довольно сложно.

3) профилировщики не помогают, так как они дают мне время, потраченное на код, что опять же в пользу версии, которая выполняет system ()

Мне нужно рекурсивно суммировать все процессорное время, которое потребляют эти программы, включая пользователя, ядро, ввод-вывод и дочерние элементы.

Я ожидал, что это обычная проблема, но все еще не нашел решения.

(Решено с помощью times () - см. Ниже. Всем спасибо)

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
4 423
5

Ответы 5

Если я понял, ввод «time myapplication» в командной строке bash - это не то, что вы ищете.

Если вам нужна точность, вы должны использовать профилировщик ... У вас есть исходный код, да?

Попробуйте что-нибудь вроде Опрофайл или Валгринд, или посмотрите это для более расширенного списка.

Если у вас нет источника, честно говоря, я не знаю ...

Выполните их тысячу раз, измерьте фактически затраченное время, а затем усредните результаты. Это должно сгладить любые отклонения, связанные с другими приложениями, работающими на вашем сервере.

Я бы, вероятно, склонялся к добавлению «time -o somefile» в начало системной команды, а затем добавлял бы его ко времени, заданному временем вашей основной программы, чтобы получить итог. Если мне не приходилось делать это много раз, я бы нашел способ взять два вывода времени и добавить их на экран (используя awk, оболочку, perl или что-то еще).

это сработает на один шаг вниз по вилочной цепи. Если моя внешняя команда запускает еще детей - чего я не знаю - я получу неверные результаты

n-alexander 01.10.2008 13:45

/ 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

не дает мне детское время, но все равно полезно

n-alexander 01.10.2008 13:47

Кажется, я наконец его нашел.

ИМЯ раз - получить время обработки

ОБЗОР #включают

   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. Можно сказать, что это стандартный интерфейс командной строки.

user677656 17.01.2012 19:56

Другие вопросы по теме