计算执行的c ++指令

时间:2018-04-04 13:22:23

标签: c++ performance static-analysis

我有兴趣计算在特定c ++程序中执行的c ++指令的数量,以便将理论效率(我已计算)与实际效率进行比较。计算理论效率我正在计算指令的数量,这就是我需要计算程序执行的总c ++指令的原因。

例如,对于此代码:

for(int i = 0; i < 2; i++) {
    c++;
    d++;
}

它应该显示我执行了4条指令(如果我们在for循环中计算自动i ++,则为6条)。

有什么办法吗?我已经搜索了相关的问题,但我不想在汇编代码中计算指令,我希望c ++指令计数。

2 个答案:

答案 0 :(得分:3)

C ++没有&#34;指令&#34;但是陈述(并且不清楚为什么i++, j++; - 这是一个带comma operator的单一陈述 - 应该与i++; j++;的计算方式不同,两者都可以相同 semantics并且可能会在大多数编译器中生成相同的代码....)

(所以你的问题不清楚,可能毫无意义)

C ++编译器可以optimize将您的代码(使用as-if rule)改为等同于

c += 2;
d += 2;

与您的代码块具有相同的 observable 行为。然后&#34;语句计数&#34;你想测量吗? Loop unrolling是一种非常常见的优化(大多数编译器都会这样做)。

最后,在现代CPU(如笔记本电脑中的CPU)上,由于machine code,执行时间与执行的C ++语句(甚至是cache指令)的数量无关。问题,branch predictorsinstruction pipeliningsuperscalar processors等......

也许您需要profiling个工具。在Linux上,如果你编译with g++ -pg -O然后使用gprof(1)(但也要注意perf(1)),你会得到一些接近你想要的东西。

(我不确定你的问题是否真的有意义;更有意义的是某些基准的测量时间,你重复几次并且你做得足够长 - 至少练习半秒钟。 )功能

另请阅读Worst Case Execution Time(WCET)。有与之相关的工具。

请记住time complexityasymptotic。它关心任意大输入大小的时序,当你谈到 O(n)时,限制和收敛的概念是必不可少的。

不要忘记优化编译器正以某种重要方式改变您的代码。请参阅CppCon 2017:Matt Godbolt谈话:“What Has My Compiler Done for Me Lately? Unbolting the Compiler's Lid”(这也提示了为什么在实践中一个体面的C ++编译器必须进行大量优化;没有它们C ++实际上是useless)。

如果您准备花费数月时间来获得或多或少的通用解决方案,那么您可以设计并制作一些GCC plugin来将程序代码添加到您的程序中。我认为这不值得努力,但你可以自由尝试。

这种假设的GCC插件的部分难点在于精确地 大多数真正的C ++代码都使用....你会发现它并不简单......动态语句计数究竟是什么 - 在你的定义不明确的情况下使用一些真正的C ++代码containersstd::vector<int> v(10); v.push_back(2); ??您的度量可能特定于C ++标准库的某些特定实现(例如GCC)。

(这也是你的问题没有任何意义的另一个原因;请注意我的Linux桌面#include <vector>扩展到近万行,但大多数语句都得到优化并删除为<vector>)功能

如果您只想获得某个特定程序的度量,那么在每个dead code中手动添加一些全局计数器增量会更简单(但仍然无用)。如果您采用特定但冗长的 - 很难遵循C ++编码风格,其中每个基本块语法大括号{}中的一个块,这可能很容易,也许可能会自动完成(至少如果你不使用大多数C ++特性,比如它的容器)。

但我建议使用现有的分析,basic blockscode coverage和计时工具(例如在Linux gprofperf,{{ 3}},benchmarking等......;另见gcov(1)

答案 1 :(得分:-1)

检查linux的sloccount。

此外,您可以使用cloc实用程序来计算代码行。

http://cloc.sourceforge.net/

运行时执行的行数可能因输入数据而异。您可以使用分析工具来了解覆盖范围或执行更多行。