скорость профильной программы в Linux - PullRequest
1 голос
/ 29 сентября 2008

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

Один делает все это на С и в памяти. Другой вызывает внешнюю утилиту и выполняет IO.

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

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

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

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

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

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

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

Ответы [ 5 ]

2 голосов
/ 29 сентября 2008

/ 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
2 голосов
/ 29 сентября 2008

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

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

Попробуйте что-то вроде Oprofile или Valgrind , или посмотрите this для более расширенного списка.

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

1 голос
/ 01 октября 2008

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

NAME времена - получить время процесса

СИНТАКСИС #include

   clock_t times(struct tms *buf);

ОПИСАНИЕ times () хранит текущее время процесса в структуре tms, которая указывает на. Структура 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? Или, может быть, я просто невежественен.

1 голос
/ 29 сентября 2008

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

0 голосов
/ 29 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...