2

То, что я ищу, это что-то вроде /usr/bin/time , однако обычно это не имеет достаточной точности.

Я запускаю программу на C (которую я могу редактировать и перекомпилировать), и мне нужно контролировать пользователя / систему / реальное время, использование процессора, пиковую память и т.д.

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

Теперь у меня есть простой bash-скрипт, который записывает время начала в наносекундах, запускает программу, а затем записывает время окончания в наносекундах и затем сообщает о разнице. Это отлично подходит для реального времени (настенные часы), но не так хорошо для времени выполнения, потому что это многопользовательский компьютер.

Примечания: я ограничен Bash как оболочка; машина работает под CentOS 6.4; Я открыт для решений на C, которые не требуют установки какого-либо нового программного обеспечения.

1 ответ1

0

Вы можете сделать это используя systemtap. Из одного из примеров на их сайте:

general/stopwatches.stp - Посмотрите, сколько времени настенные часы затрачивает процесс на различные ключевые слова состояний: ВРЕМЯ

Сценарий stopwatch.stp иллюстрирует, как с помощью нескольких секундомеров записывать, сколько времени настенного таймера блокирует процесс в пространстве ядра и пользователя. При выходе скрипт выводит время в секундах, миллисекундах, микросекундах и наносекундах. Обратите внимание, что этот вывод этого сценария не сопоставим напрямую с командой времени, потому что время записывает время, когда процесс фактически активен в пространстве ядра и пользователя.

# stap stopwatches.stp -c "sleep 1"

Код из этого примера воспроизведен здесь для полноты:

#! /usr/bin/env stap
# Copyright (C) 2012 Red Hat, Inc.
# by William Cohen <wcohen@redhat.com>
#
# exercise the stopwatch tapset

probe begin
{
  start_stopwatch("wall");
  /* The next two lines assumes that target is running and in user-space. */
  start_stopwatch("user");
  stop_stopwatch("system")
}

probe syscall.*
{
   if (pid() != target()) next
   stop_stopwatch("user")
   start_stopwatch("system")
}

probe syscall.*.return
{
   if (pid() != target()) next
   start_stopwatch("user")
   stop_stopwatch("system")
}

probe end
{
  stop_stopwatch("wall")
  stop_stopwatch("user")
  stop_stopwatch("system")

  w = read_stopwatch_us("wall")
  u = read_stopwatch_us("user")
  s = read_stopwatch_us("system")
  printf ("wall clock                 %12dus\n", w);
  printf ("wall clock in user-space   %12dus\n", u);
  printf ("wall clock in kernel-space %12dus\n", s);

   delete_stopwatch("wall")
   delete_stopwatch("user")
   delete_stopwatch("system")
 }

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .