Как я могу осмыслить данные профилирования С++ в Windows, когда компилятор получает встроенный код? То есть Я, конечно, хочу измерить код, который действительно запускается, поэтому по определению я собираюсь измерить оптимизированную сборку кода. Но похоже, что ни один из инструментов, которые я пытаюсь, фактически не может решить встроенные функции.
Я пробовал как профилировщик выборки в Visual Studio 2017 Professional, так и VTune 2018. Я попытался включить /Zo
, но, похоже, это не влияет.
Я нашел следующий ресурс, который, по-видимому, указывает, что только Visual Studio Ultimate или Premium поддерживают встроенную фрейм-информацию - это все еще верно для Visual Studio 2017? https://social.msdn.microsoft.com/Forums/en-US/9df15363-5aae-4f0b-a5ad-dd9939917d4c/which-functions-arent-pgo-optimized-using-profile-data?forum=vsdebug
Вот пример кода:
#include <cmath>
#include <random>
#include <iostream>
inline double burn()
{
std::uniform_real_distribution<double> uniform(-1E5, 1E5);
std::default_random_engine engine;
double s = 0;
for (int i = 0; i < 100000000; ++i) {
s += uniform(engine);
}
return s;
}
int main()
{
std::cout << "random sum: " << burn() << '\n';
return 0;
}
Скомпилируйте его с помощью Visual Studio в режиме Release. Или в командной строке попробуйте cl /O2 /Zi /Zo /EHsc main.cpp
. Затем попробуйте профилировать его с помощью Profiler Profiler в Visual Studio. Вы больше всего увидите что-то вроде этого:
VTune 2018 похож на Windows. На Linux, perf и VTune нет проблем с отображением кадров из встроенных функций... Является ли эта функция, которая, на мой взгляд, решающей для инструментария на С++, действительно не является частью инструментальных цепей без Premium/Ultimate Visual Studio? Как люди с Windows справляются с этим? Какая точка /Zo
тогда?
EDIT: Я просто попытался скомпилировать минимальный пример выше с clang, и он создает разные, но все же неудовлетворительные результаты? Я скомпилировал clang 6.0.0 (trunk), построил из LLVM rev 318844 и clang rev 318874. Затем я скомпилировал свой код с clang++ -std=c++17 -O2 -g main.cpp -o main.exe
и снова запустил результирующий исполняемый файл с помощью Sampling Profiler в Visual Studio, результат:
Итак, теперь я вижу функцию burn
, но потерял информацию о исходном файле. Кроме того, uniform_real_distribution
по-прежнему не отображается нигде.
EDIT 2: Как было предложено в комментариях, я также опробовал clang-cl
с теми же аргументами, что и cl
выше, т.е.: clang-cl.exe /O2 /Zi /Zo /EHsc main.cpp
. Это дает те же результаты, что и clang.exe
, но мы также получаем несколько рабочих сопоставлений источника:
РЕДАКТИРОВАТЬ 3: Я изначально думал, что Кланг магически решает эту проблему. Это не печально. Большинство встроенных кадров по-прежнему отсутствуют: (
РЕДАКТИРОВАТЬ 4: Встроенные фреймы не поддерживаются в VTune для сборки прикладных программ с сборками MSVC/PDB: https://software.intel.com/en-us/forums/intel-vtune-amplifier-xe/topic/749363