Мы используем указатель для повышения потока для хранения глобальных данных только для этого конкретного потока. Ниже приведен синглтон, который мы возвращаем, когда кто-то вызывает GetInstance ().
Мой вопрос примерно, сколько времени требуется, чтобы получить указатель конкретного потока (m_tspConnectionManager.get ();) по сравнению с обычным доступом указателя?
Я использовал приведенный ниже код (где я вызываю метод .get () дважды), и для выполнения всей функции потребовалось около 3 секунд.
typedef boost::thread_specific_ptr<ConnectionManager> ConnMgrPtr;
static ConnMgrPtr m_tspConnectionManager;
static ConnectionManager* GetInstance()
{
if(!m_tspConnectionManager.get())
{
//first time called by this thread
//ConnectionManager* to be used in all subsequent calls from this thread
m_tspConnectionManager.reset(new ConnectionManager());
}
return m_tspConnectionManager.get();
}
Теперь я изменил приведенный выше код для вызова метода .get () только один раз, и это заняло около 1,9 секунды.
static ConnectionManager* GetInstance()
{
ConnectionManager* pConnMgr = m_tspConnectionManager.get();
if(pConnMgr == NULL)
{
//first time called by this thread
//ConnectionManager* to be used in all subsequent calls from this thread
m_tspConnectionManager.reset(new ConnectionManager());
}
return pConnMgr != NULL ? pConnMgr : m_tspConnectionManager.get();
}
поэтому, просто не вызывая метод .get (), я мог видеть прирост производительности на 1,1 секунды. Я пытался понять, как мы получаем прибыль?
нота: Это усиление может быть коллективным усилением многократного вызова функции GetInstance (). Просто пытаюсь понять усиление одного звонка здесь.
Вряд ли get()
занимает много времени (хотя, конечно, это медленнее, чем НЕ звонить get()
.) При «нормальной» реализации TLS ваш объект находится на расстоянии не более трех косвенных указателей. (Регистр блока потока -> Блок TLS -> ваш указатель.) Но если вы звоните GetInstance()
достаточно, тогда любое замедление может стать большим замедлением.
Я бы посмотрел как часто GetInstance()
называется Попробуйте уменьшить это число, кэшируя возвращаемый указатель. Конечно, вторая реализация предпочтительнее первой.
Других решений пока нет …