假设我有一个类似的函数:
template<typename It, typename Cmp>
void mysort( It begin, It end, Cmp cmp )
{
std::sort( begin, end, cmp );
}
当我使用它编译时-finstrument-functions-after-inlining
with 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))
to mysort
(以及调用的函数mysort
),但这似乎对这些标准库调用没有影响。
有谁知道是否可以忽略标准库函数内部的函数检测,例如std::sort
?理想情况下,我只会mysort
仪器化,因此一次进入和一次退出!
我看到clang++
遗憾的是还不支持类似的东西finstrument-functions-exclude-function-list
or finstrument-functions-exclude-file-list
, but g++
尚不支持-finstrument-functions-after-inlining
这是我理想的状态,所以我被困住了!
编辑:玩得更多后,对执行时间的影响实际上比描述的要小,所以这不是世界末日。然而问题仍然存在,因为大多数从事函数检测的人clang
仅关心应用程序代码,而不关心从(例如)标准库链接的那些函数。
EDIT2:为了进一步强调这个问题,现在我已经让它在合理的时间范围内运行:我使用这两个标准库函数从检测代码生成的结果跟踪是 15GB。当我对跟踪进行硬编码以忽略两个函数地址时,生成的跟踪为 3.7MB!