Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 计算条件跳跃_Linux_Assembly_Branch_Conditional_Perf - Fatal编程技术网

Linux 计算条件跳跃

Linux 计算条件跳跃,linux,assembly,branch,conditional,perf,Linux,Assembly,Branch,Conditional,Perf,我有个不着边际的问题。我对Linux完全陌生 我想计算一个程序执行的条件跳转的数量(即程序执行的if()s、while()s等的数量) 我被告知我可以用perf来做这件事,我读了很多,但我完全迷路了 谁能告诉我怎么做?例如,我有一个C++程序,它是类似的: ...some code... if(a=5) x=3; else x=5; ...some code... 假设这段代码被编译成一个名为tmp的文件 我试图发布以下内容: perf stat ./tmp 但是每次我得到的分支数量

我有个不着边际的问题。我对Linux完全陌生

我想计算一个程序执行的条件跳转的数量(即程序执行的if()s、while()s等的数量)

我被告知我可以用perf来做这件事,我读了很多,但我完全迷路了

谁能告诉我怎么做?例如,我有一个C++程序,它是类似的:

...some code...
if(a=5)
  x=3;
else
  x=5;
...some code...
假设这段代码被编译成一个名为tmp的文件

我试图发布以下内容:

perf stat ./tmp
但是每次我得到的分支数量都不一样

我做错什么了吗


编辑:我应该提到,我假设我没有可用的源代码。所以我看的是二进制文件。

逻辑上,每次运行程序时分支的数量都会发生变化,因为在
main
函数之前执行的代码每次可能做不同的事情。(例如:
perf stat true
将每次报告不同数量的分支)


perf stat
的有趣之处在于分支未命中的数量,这对程序的执行速度有负面影响(除非你运行一个分支未命中率为100%的程序很长一段时间,否则你不会看到它,所以这不是一个真正重要的负面影响)。

好的,我找到了一个解决方案,但忘了在这里发布它。
计数分支应始终与程序中的分支数(if()s,whiles()s…)相对应。事实证明,我可以使用硬件事件号+Umask(参考:英特尔软件工程师手册)作为条件分支指令的参数来执行perf stat

您想计算高级源代码对此的看法,还是计算生成的机器代码(这将是一个不同的答案)?通过机器代码递归地跟踪执行路径并不困难,只需要一个分解器的一小部分。我正在计算生成的机器代码(即二进制文件)中的跳跃。但是我没有完全理解你的意思。在这两种情况下,条件句的数量应该是相同的,对吧?我得问:什么时候这些信息相关/有趣?这是我的一些想法的一部分,在我投入更多的时间和精力之前,我正在尝试看看它是否有效。啊,谢谢,但我对条件句感兴趣。。。它应该始终对应于程序中的分支数(if()s,whiles()s…)。事实证明,我可以通过使用条件分支指令的硬件事件号+Umask作为perf stat的参数来实现这一点!例如,在我的例子中(在Core2Duo系统上)变成:perf stat-e branchs,r8b00您的程序Achiles,您能给我们展示完整的perf命令行和完整的CPU型号吗?使用了哪个事件以及umask是什么。@osgx我猜有点晚了,但为了帮助将来的查询(在core2Duo系统上-不记得确切的CPU型号):
perf stat-e branchs,r8b00您的_程序
是像BR_INST_EXEC.ANY或BR_INST_EXEC.COND这样的事件吗,和BR_INST_RETIRED.CONDITIONAL&BR_INST_EXEC.ALL_CONDITIONAL for recent cpu cores?@osgx已经有几年了,但我想我看了失效的条件分支指令(BR_INST_RETIRED.CONDITIONAL)来构建程序在特定执行中遵循的实际控制流路径。