根据执行时间分析C++项目
Profiling a C++ project in terms of execution time
在执行时间方面,我需要一些帮助来分析现有代码。目的是加快速度。
我得到了一些以前处理过的代码。它完全是用 OO 概念C++编写的。它有一个基于 GUI 的界面,选择某个选项会运行选定的代码。(作为项目的一部分,大约有11个类)。
我希望能够按 GUI 选项并让代码运行并生成资源映射,如下所示:
Functions of Class 1 = 20% of execution time
Functions of Class 2 = 60% of execution time
Functions of Class 3 = 10% of execution time
Functions of Class 4 = 10% of execution time
这样,我就知道哪个班级占用的时间最多,然后知道该努力和改进哪个。但是,我不知道该怎么做。我只有基本的C++知识。
我确实读过这篇文章:查找c ++执行时间,但是由于该程序不是串行的。一个类调用另一个类,另一个类调用另一个类,我不知道系统时钟/时钟周期如何实现?
我读过Valgrind,Zoom,Poor Man's Profiler等程序,但老实说,我不知道将其与代码集成。有这么简单的方法吗?
我还阅读了这种方法:如何分析在 Linux 中运行C++代码?,但是我不明白如何获得有关基于类的信息(类 1、类 2 等)的精确信息。
有人可以为新手提供建议吗?
Valgrind(子工具调用研磨)使用起来非常简单。你只需要确保足够的调试信息被编译/链接到你的程序中,以便callgrind可以找到被调用的各种函数的名称。然后,不要直接调用程序,而是将其(及其参数)作为参数传递给 valgrind,例如:
valgrind --tool=callgrind --trace-children=yes <myprogram> <myprogram_args>
(--trace-children在那里,以防您的真正可执行文件隐藏在包装脚本的某个层或几层后面)
请注意,程序的运行速度会慢得多(例如慢 100 倍),因为每个函数入口点都会被跟踪。
存在各种工具来探索callgrind的输出,特别是kcachegrind/qcachegrid。
或者,您可以测量一些少量高级函数的系统时钟周期(因此您可以看到"函数 X 及其下的所有内容所花费的时间"),并在找到热点时向下浏览代码。
像这样的东西(从概念上讲,需要正确组织到标题/源中):
struct FunctionTimer {
FunctionTimer(char const * name) : mName(name), mStartTime(clock()) { }
~FunctionTimer() { mFunctionTimes[mName] += clock() - mStartTime; }
static void report()
{
... iterate through mFunctionTimes, printing out
the names and accumulated ticks ...
}
std::string mName;
clock_t mStartTime;
static std::map<std::string, clock_t> mFunctionTimes;
};
...
void myfunc()
{
FunctionTimer ft("myfunc");
... code of myfunc ...
}
...
int main(int argc, char* argv[])
{
... do stuff ...
FunctionTimer::report();
}
一个丑陋的解决方案是围绕每个感兴趣的函数启动和停止计时器,在每次调用后将时间添加到某个全局变量中。然后,在主要结束时,您只需比较变量即可计算百分比时间。
但是,这可能会变得非常恶心,尤其是在有很多功能的情况下。如果您熟悉面向方面的C++风格,则可以暂时使用它,因为方面可以让您更轻松地将样板代码放在所有函数周围。
维基百科维护了一个很好的 c 和 c++ 性能分析工具列表,看看它们是否对你有帮助。
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 欧拉项目#8答案是大以获得有效答案
- 从链接列表c++中删除一个项目
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 既然存在危险,为什么项目要使用-I include开关
- cmake在我的项目中所需的所有静态库都不成功
- QT通过C++添加映射QML项目
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在linux上调试巨大的C++项目
- 在其他文件中创建类时在 c++ 项目中不起作用
- 使外部项目可用于find_package CMake
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- 如何维护资源管理器项目视图中当前可见的项目列表
- 错误-我无法在VS2019中打开新的Qt项目
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗