Igors, если делаешь тест, то делай компилябильный проект.
=====
1) C++ (Qt)
void MyThread::run( void )
{
float f;
while (true) {
QMutexLocker blk(&mutexJob);
if (!mList->size()) return;
f = mList->last();
mList->pop_back();
++mNumCalc;
blk.unlock();
Calc(f, NUM_CALC);
}
}
В данном случае лучше не использовать QMutexLocker ! Каждую итерацию создается и уничтожается объект QMutexLocker, что накладно!
Лучше так
C++ (Qt)
void MyThread::run( void )
{
float f;
while (true) {
mutexJob.lock();
if (!mList->size()) {
mutexJob.unlock();
return;
}
f = mList->last();
mList->pop_back();
mutexJob.unlock();
++mNumCalc;
Calc(f, NUM_CALC);
}
}
2) C++ (Qt)
void Calc( float f, int num )
{
float sum = 0.0f;
for (int i = 0; i < num; ++i) {
sum += log(atan2(f, f * 0.34));
sum += cos(f) * sin(f);
#if CRAZY_TEST
QMutexLocker test(&mutexTmp);
++sum;
#endif
}
}
- Опять же, каждую итерацию цикла создается и уничтожается объект QMutexLocker, что очень очень накладно (здесь твои тормоза)
- Не вижу ни какого смысла в QMutexLocker test(&mutexTmp); в данном случае
- И вообще, данная функция ничего не возвращает
Могу предположить что это написано только ради теста.
Теперь советы по оптимизации:
- Не используй QMutexLocker для часто вызываемого участка кода, используй непосредственно QMutex (lock/unlock), поскольку создание и уничтожение объекта дорго.
- Желательно выносить(не блокировать) участки которые этого не требуют, например: ++mNumCalc;
- Во определенных случаях, если есть глобалы типа int, то для работы с ними не обязателено использовать QMutex. Можно использовать атомарные операции. Пример:
Предположим что int sumVal глобально накапливает некоторую сумму по всем потокам:
C++ (Qt)
QAtomicInt sumVal = 0;
void Calc( float f, int num )
{
float sum = 0.0f;
int addVal;
for (int i = 0; i < num; ++i) {
sum += log(atan2(f, f * 0.34));
sum += cos(f) * sin(f);
++sum;
addVal = (int)log(atan2(f, f * 0.34));
sumVal.fetchAndAddAcquire(addVal);
}
}
Это гораздо дешевле чем:
C++ (Qt)
int sumVal = 0;
void Calc( float f, int num )
{
float sum = 0.0f;
int addVal;
for (int i = 0; i < num; ++i) {
sum += log(atan2(f, f * 0.34));
sum += cos(f) * sin(f);
++sum;
addVal = (int)log(atan2(f, f * 0.34));
mutexJob.lock();
sumVal += addVal;
mutexJob.unlock();
}
}
И кстати из QAtomicInt sumVal; читать всегда безопасно.