Я использую Visual Studio для профилирования моего многопоточного приложения на C++. Из того, что я прочитал о методе Sampling, я понимаю, что он смотрит на процессор через определенные интервалы, чтобы увидеть, какая функция выполняется.Профилирование многопоточного кода, как работает выборка
Мне любопытно, как он обрабатывает многопоточный код. Вполне возможно, что две или более функции могут выполняться одновременно на разных потоках на разных ядрах. В этом случае используется ли счетчик выборки для обеих этих функций? Я считаю, что это то, что на самом деле происходит.
Это фактически затрудняет получение информации из отчета о профилировании. Функция, которая имеет наибольшее количество собранных образцов, если они выполняются в рабочем потоке, может выполняться на другом ядре (чем основной поток) и вообще не может влиять на производительность приложения. Но если он отключает основной поток для выполнения своей работы, то он должен иметь заметное влияние на производительность.
Есть ли лучший способ профилировать многопоточный код?
Да. Если потоки не влияют на производительность вашего приложения, вы делаете это неправильно, и вам, конечно, лучше не использовать их вообще. Модулирование необходимости асинхронности для предотвращения зависания пользовательского интерфейса, но это не параллелизм. Выяснение, почему многопоточные программы всасывают грязь, требуется другой тип инструмента, [анализатор параллелизма] (https://msdn.microsoft.com/en-us/library/dd537632.aspx?f=255&MSPPError=-2147217396) , –