Логирование времени выполнения кода
От: sax0n Украина  
Дата: 25.08.11 14:44
Оценка:
Есть иерархия классов логирования на С++
class ICustomEvent;
class EventManager;

// call
{
EventManager::Instance()->AddEvent( new ICustomEvent( /* params */ ) );
}


По поводу не использовать велосипед просьба не писать.
Проблема такая, что мне необходимо засекать время выполнения кода. По большому счету — выполнение кода текущего стека
{
EventManager::Instance()->AddEvent( new ICustomEvent( /* params */ ) ); // start timer
// code

} // stop timer


Не могу придумать, как можно удобно сделать этот самый класс таймера.
хочется:
1. создавать объект на стеке, который в конструкторе засекает, в деструкторе сохраняет значение в событие
2. писать все не более, чем в 1 строчку.

Вариант сейчас такой созрел: написать декоратор для событий, который будет иметь 2 доп. метода: старт/стоп
Создать класс, который будет получать ссылку на декоратор, создаваться на стеке, и выставлять все параметры. но это много и как-то некрасиво.
Re: Логирование времени выполнения кода
От: ShubinEV Россия http://erladvisor.blogspot.de/
Дата: 26.08.11 06:27
Оценка:
Здравствуйте, sax0n, Вы писали:

S>1. создавать объект на стеке, который в конструкторе засекает, в деструкторе сохраняет значение в событие

S>2. писать все не более, чем в 1 строчку.
boost.timer

S>По поводу не использовать велосипед просьба не писать.

Скопируй себе и переименуй идентификаторы. После этого можно считать что это свой велосипед.
Re[2]: Логирование времени выполнения кода
От: sax0n Украина  
Дата: 26.08.11 07:57
Оценка:
Здравствуйте, ShubinEV, Вы писали:

SEV>Здравствуйте, sax0n, Вы писали:


S>>1. создавать объект на стеке, который в конструкторе засекает, в деструкторе сохраняет значение в событие

S>>2. писать все не более, чем в 1 строчку.
SEV>boost.timer

S>>По поводу не использовать велосипед просьба не писать.

SEV>Скопируй себе и переименуй идентификаторы. После этого можно считать что это свой велосипед.

Ха. У меня не стоит проблема написать сам таймер (за boost::timer спасибо).
Проблема, как лучше связать событие с таймером, чтобы это было просто в использовании.
Сейчас вариант такой (это больше схематическое представление.):

/// Интерфейс, базовый для любого события
class ICustomEvent: public IInterface
{
/* .. */
};

/// Декоратор для любого события
/// принимает аргументом интерфейс таймера, который в деструкторе выставит значения в событие
class TimerDecorator: public ICustomEvent
{
public:
  TimerDecorator( ICustomEvent *pEvent, ITimer &timer )
    m_pEvent( pEvent )
  {
    timer.SetDest( this );
  }

void SetStartTime();
void SetFinishTime();
};

class ITimer
{
public:
  ITimer()
  {
    m_start = timerStart;
  }
  
  ~ITimer()
  {
    if ( m_pDecorator ){ m_pDecorator->SetStartTime(); m_pDecorator->SetFinishTime(); }
  }

  void SetDest( TimerDecorator *pTimerDecorator ){ m_pDecroator = pTimerDecorator; }

private:
  TimerDecorator *m_pDecorator;
};

/// Использование
{
  ITimer timer;
  Manager()->AddEvent( new TimerDecorator( new ICustomEvent(), timer ) );
  // some code
}


В принципе, по использованию оно подходит. Но не нравится эта связь декоратор-таймер. Что, если вдруг декоратор будет уничтожен раньше.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.