Давайте рассмотрим код C, поэтому мы не учитываем время GC.
Я предполагаю, что избыточное время происходит не в каждом кадре, но довольно редко, поэтому любой профилировщик, который просто измеряет совокупное время, неЯ расскажу вам многое.
Что я хотел бы сделать (и это может быть непросто), так это попытаться сказать, что делает программа, только когда она работает, а не все время.Если возможно, в начале каждого кадра я бы установил таймер будильника, настроенный на отключение через достаточное количество миллисекунд, чтобы он срабатывал где-то в это дополнительное время.Затем в конце вычисления кадра я бы отключил таймер, чтобы он не выключился после завершения кадра.Возможно, было бы полезно добавить небольшое случайное число миллисекунд к таймеру.
Затем, когда таймер выключится, я соберу образец стека и изучу его, чтобы увидеть, что делает программа.
Вероятно, трудно собрать образцы и сохранить их для последующего просмотра.Вероятно, проще и более информативно просто войти в отладчик, когда сработает сигнализация, и изучить стек и то, что программа делает в это время правильно.Чтобы получить другой пример, либо просто возобновите выполнение, либо начните заново с самого начала.
Дело в том, что вы хотите знать, что он делает, и почему он делает это в такое избыточное время.Вы надеетесь, что лишняя работа, которую он выполняет, или какая-то ее часть, происходит в это избыточное время.
Вам может потребоваться до 20 образцов, прежде чем вы увидите что-то интересное, но как только больше одногоВ примере показано, что происходит нечто, чего вы на самом деле не понимали, и вы можете от него избавиться, что значительно сократит использование лишнего времени.Чем меньше образцов вы должны взять, прежде чем увидите, тем больше будет сокращено время.
Вероятно, существует более одной такой проблемы, поэтому не останавливайтесь после того, как первое, что вы найдете.Делайте это снова и снова, пока не найдете ничего, что могли бы удалить.