如何测量代码片段的调用次数和经过时间
Posted
技术标签:
【中文标题】如何测量代码片段的调用次数和经过时间【英文标题】:how to measure calls count and elapsed time of code snippets 【发布时间】:2014-07-04 14:00:35 【问题描述】:当然,我有我的源代码,我正在寻找类似 QML Profiler (Qt Creator) 的东西,但使用的是纯 C++ 代码。我是否必须为此编写自己的代码,或者我可以使用一些工具?
对我来说最重要的是代码中函数调用的时间和次数
编辑:我正在使用 Windows 7,但重新启动到 Ubuntu 应该没有问题(我不熟悉类似 unix 的操作系统:()
Edit2:我正在尝试寻找一些调用图工具,在第一行我将尝试 doxygen
【问题讨论】:
阅读profiling,看看你的编译器需要哪些选项来启用它。 Visual Studio 有一个相对不错的内置分析器。 【参考方案1】:您正在寻找 CPU 分析器。我正在使用GNU gprof。
这是我在link 中使用的小指南。
这是我在代码中从探查器获得的示例输出(在实际运行之前您可以在其中看到),您可以得到您想要的结果:
Flat profile:
Each sample counts as 0.01 seconds.
% cumulative self self total
time seconds seconds calls ms/call ms/call name
52.00 0.13 0.13 5 26.00 26.00 compute_variances(unsigned int, std::vector<float, std::allocator<float> > const&, int, unsigned int const&, float*, float*, unsigned int*)
....
....
% the percentage of the total running time of the
time program used by this function.
cumulative a running sum of the number of seconds accounted
seconds for by this function and those listed above it.
self the number of seconds accounted for by this
seconds function alone. This is the major sort for this
listing.
calls the number of times this function was invoked, if
this function is profiled, else blank.
self the average number of milliseconds spent in this
ms/call function per call, if this function is profiled,
else blank.
total the average number of milliseconds spent in this
ms/call function and its descendents per call, if this
function is profiled, else blank.
name the name of the function. This is the minor sort
for this listing. The index shows the location of
the function in the gprof listing. If the index is
in parenthesis it shows where it would appear in
the gprof listing if it were to be printed.
[编辑]
不用担心 Linux! 只需打开一个终端并执行(如果您只有一个 .cpp 文件)
g++ main.cpp -Wall -std=c++0x -p -pg -O3 -o myExe
然后按照我的链接中的步骤进行操作。
要更多文件,只需制作一个makefile,如下所示:
sr: main.cpp polytope.cpp quadtree.cpp
g++ -Wextra -Wall -Wreorder -lm -o sr main.cpp polytope.cpp quadtree.cpp IO.cpp
永远记得在 makefile 中使用制表符而不是空格。我的makefile太简单了。谷歌搜索可以产生更好的生成文件。这里是可执行文件。
正如@MK 所说,在 Visual Studio 中,您可以使用他们的profiler。
[/编辑]
但是,有时您只想计算时间。为此,您可以这样做:
#include <iostream>
#include <ctime>
#include <ratio>
#include <chrono>
int main ()
using namespace std::chrono;
high_resolution_clock::time_point t1 = high_resolution_clock::now();
std::cout << "printing out 1000 stars...\n";
for (int i=0; i<1000; ++i) std::cout << "*";
std::cout << std::endl;
high_resolution_clock::time_point t2 = high_resolution_clock::now();
duration<double> time_span = duration_cast<duration<double>>(t2 - t1);
std::cout << "It took me " << time_span.count() << " seconds.";
std::cout << std::endl;
return 0;
或在我的伪网站上找到的任何其他 method。
【讨论】:
【参考方案2】:如果您使用的是 GCC,那么您已经获得了 gprof
,您所需要做的就是使用 -pg
进行编译。还有Google Performance Tools。
【讨论】:
我正在尝试使用 gprof,但我没有必需的符号(无论是什么意思) gprof.exeg++
选项-pg
编译了您的可执行文件以上是关于如何测量代码片段的调用次数和经过时间的主要内容,如果未能解决你的问题,请参考以下文章
如何从片段中调用 getSupportFragmentManager()?
Android:如何在选项卡内从一个片段导航到另一个片段? [关闭]