如何测量代码片段的调用次数和经过时间

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.exe 没有符号 @BartłomiejSobieszek 您是否使用g++ 选项-pg 编译了您的可执行文件 让我来看看 CMD 的乐趣 好的,似乎可以工作,exe文件已编译,但我只能看到exe文件,我还要找什么? @BartłomiejSobieszek,您为什么不检查我的答案中的链接?它说明了你必须做什么。只是因为没有让保罗一次又一次地回答。

以上是关于如何测量代码片段的调用次数和经过时间的主要内容,如果未能解决你的问题,请参考以下文章

如何从片段中调用 getSupportFragmentManager()?

如何从片段 KOTLIN 中调用意图 [重复]

如何在Sublime Text中添加代码片段

Android:如何在选项卡内从一个片段导航到另一个片段? [关闭]

如何在 Toad for Oracle 中使用自定义代码片段?

使用意图从另一个片段调用一个片段