【发布时间】:2020-11-09 23:55:21
【问题描述】:
假设我有一个类似的函数:
template<typename It, typename Cmp>
void mysort( It begin, It end, Cmp cmp )
{
std::sort( begin, end, cmp );
}
当我使用 -finstrument-functions-after-inlining 和 clang++ --version 编译它时:
clang version 11.0.0 (...)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: ...
仪器代码爆炸执行时间,因为每次调用都会调用我的进入和退出函数
void std::__introsort_loop<...>(...)
void std::__move_median_to_first<...>(...)
我正在对一个非常大的数组进行排序,所以我的程序没有完成:没有插桩大约需要 10 秒,使用插桩我在 10 分钟就取消了。
我尝试将__attribute__((no_instrument_function)) 添加到mysort(以及调用mysort 的函数),但就这些标准库调用而言,这似乎没有效果。
有谁知道是否可以忽略像std::sort 这样的标准库函数内部的函数检测?理想情况下,我只会检测mysort,所以只有一个入口和一个出口!
我看到clang++ 遗憾地还不支持finstrument-functions-exclude-function-list 或finstrument-functions-exclude-file-list 之类的东西,但g++ 还不支持我理想情况下拥有的-finstrument-functions-after-inlining,所以我被卡住了!
编辑:玩多了之后,看起来对执行时间的影响实际上比描述的要少,所以这不是世界末日。然而问题仍然存在,因为大多数在clang 中进行函数检测的人只关心应用程序代码,而不关心从(例如)标准库链接的那些函数。
EDIT2:为了进一步突出问题,因为我已经让它在合理的时间范围内运行:我使用这两个标准库函数从检测代码生成的结果跟踪是 15GB。当我对跟踪进行硬编码以忽略这两个函数地址时,生成的跟踪为 3.7MB!
【问题讨论】:
标签: c++ clang profiling clang++ instrumentation