Как определить, какой мьютекс дает наибольшее количество времени ОС? - PullRequest
2 голосов
/ 06 августа 2009

Как измерить количество времени, выделяемое мьютексом для ОС? Основная цель - обнаружить мьютекс, который блокирует потоки на наибольшее время.

PS: я попробовал oprofile. Он сообщает о 30% времени, проведенного внутри vmlinux / .poll_idle. Это неожиданно, потому что приложение рассчитано на 100% его ядра. Поэтому я подозреваю, что время возвращается операционной системе в ожидании некоторого мьютекса, а oprofile сообщает об этом как время IDLE.

Ответы [ 4 ]

3 голосов
/ 06 августа 2009

Профиль.

Всякий раз, когда возникает вопрос: «Что действительно занимает [самое | наименьшее] время?», Ответом всегда является «Профиль, который нужно выяснить».

1 голос
/ 06 августа 2009

Как предложено - профиль, но перед тем, как вы хотите измерять, решите, что вы хотите измерить - истекшее время (временные потоки были заблокированы) или время пользователя / ядра (время, затраченное на выполнение синхронизации). В разных сценариях вы можете измерить то или другое, либо оба.

0 голосов
/ 06 августа 2009
start = GetTime();
Mutex.Lock();
stop = GetTime();

elapsedTime = stop - start;

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

0 голосов
/ 06 августа 2009

Вы можете профилировать вашу программу, используя, скажем, OProfile в Linux. Затем отфильтруйте результаты, чтобы посмотреть время, потраченное в pthread_mutex_lock() для каждого мьютекса, или функцию более высокого уровня, которая выполняет блокировку. Поскольку программа будет блокировать вызов функции блокировки до тех пор, пока не будет получен мьютекс, профилирование времени, проведенного в этой функции, должно дать вам представление о том, какие мьютексы являются самыми дорогими.

...