我正在使用Perf来执行一些分析实验.
但是,我想知道特定代码区域的结果,并且在这种情况下,查看每行源代码(在本例中为C/C++)的结果(百分比)将简化任务.
perf annotate有一个视图,它显示ASM +源代码,也可以选择关闭显示源代码.我想知道如何完成此选项的另一端,即仅显示源代码+其每行事件的百分比并隐藏ASM输出.这有可能perf吗?
建议使用其他工具吗?我也在使用Vtune但是我想做的分析没有用.Valgrind是不可能的,太慢了.
我正在使用运行Ubuntu 13.04的x64.
我正在使用这些命令编译下面的代码,以便在trunk-llvm中收集边/块分析:
clang -emit-llvm -c sort.c -o sort.bc
opt -insert-edge-profiling sort.bc -o sort_prof.bc
clang sort_prof.bc -lprofile_rt -L/llvms/lib -o sort_prof
Run Code Online (Sandbox Code Playgroud)
然后我运行程序并使用llvm-prof sort_prof.bc显示分析信息,结果是:
===-------------------------------------------------------------------------===
Function execution frequencies:
## Frequency
1. 4.3e+05/708539 main
2. 2.8e+05/708539 quickSort
NOTE: 2 functions were never executed!
.....
Run Code Online (Sandbox Code Playgroud)
我的问题是关于执行频率.有没有意义主要执行4.3e + 05次?为什么这样?我正在编译的代码如下.
###################### sort.c ########################
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
const int MAX = 1000000;
void swap(int* a, int* b) {
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
int partition(int vec[], int left, int …Run Code Online (Sandbox Code Playgroud) 我已经看过两种方式的例子,特别是维基百科显示了访问对象决定访问顺序的一个例子,我认为这是一种听起来很好的方法.
我处于这种情况,我需要几个访问订单,所以让访客决定访问订单似乎是合理的.但是,如果访问者负责访问顺序(即,用于调用被访问对象的accept方法),我可以让访问者直接调用一些访问方法(即,绕过访问对象的accept方法的调用)和这似乎与模式提出的完全相反.
在我们有多个不同的访问订单时,实施访问模式以及如何处理的正确方法是什么?
我听说有人说编译器经常将循环条件移到循环的底部.也就是说,像这样的循环:
while (condition) {
...
}
Run Code Online (Sandbox Code Playgroud)
改为:
if (condition) {
do {
...
} while (condition);
}
Run Code Online (Sandbox Code Playgroud)
关于机器独立优化,为什么后者更可取?
我是编译器的初学者,但我对了解程序的结构(二进制)以及如何在内存中读取和加载以执行非常感兴趣。你们建议我阅读哪些电子书/书籍/教程以快速入门?
在尝试编译此代码时:
#include <iostream>
#include <vector>
using namespace std;
class Test {
int a;
public:
Test(int pa) : a(pa) { }
void print() {
std::cout << a << std::endl;
}
};
int main() {
Test t(31415);
t.print();
vector<Test &> vet;
vet.push_back(&t);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
gcc 4.4.5-8报告各种错误,从:
In file included from /usr/include/c++/4.4/i486-linux-gnu/bits/c++allocator.h:34,
from /usr/include/c++/4.4/bits/allocator.h:48,
from /usr/include/c++/4.4/string:43,
from /usr/include/c++/4.4/bits/locale_classes.h:42,
from /usr/include/c++/4.4/bits/ios_base.h:43,
from /usr/include/c++/4.4/ios:43,
from /usr/include/c++/4.4/ostream:40,
from /usr/include/c++/4.4/iostream:40,
from references.cpp:1:
/usr/include/c++/4.4/ext/new_allocator.h: In instantiation of ‘__gnu_cxx::new_allocator<Test&>’:
/usr/include/c++/4.4/bits/allocator.h:87: instantiated from ‘std::allocator<Test&>’
/usr/include/c++/4.4/bits/stl_vector.h:71: instantiated from ‘std::_Vector_base<Test&, std::allocator<Test&> …Run Code Online (Sandbox Code Playgroud) 如何使用Python + NLTK来识别句子是指过去/现在/将来?
我只能使用POS标记吗?这似乎有点不准确,在我看来,我需要考虑句子上下文而不仅仅是单词.
对于另一个可以做到这一点的图书馆的任何建议?
我正在创建一个 Azure Service Fabric 服务,并依靠本机 .NET 框架通过构造函数进行依赖项注入。问题是:其中一个构造函数将值类型(特别是 System.TimeSpan)作为参数。我应该/如何使用依赖注入框架注册这种类型?
澄清一下:我试图遵循此处显示的示例:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection#service-lifetimes-and-registration-options
c# dependency-injection azure microservices azure-service-fabric
我在 Debian Squeeze 上运行,并使用 apt-get install flex 安装了 flex/flex++。
不过我注意到 flex++ 只是一个指向 flex 的符号链接。那么,真的存在一个生成 C++ 扫描仪的“程序”flex++,还是只是一个我应该切换的 Flex 标志?
另外,常见的问题是:互联网上的许多示例无法在flex或flex++下“编译”。Flex 出现以下错误:
test.lex:1: invalid character: %
...
Run Code Online (Sandbox Code Playgroud)
当仅使用以下命令处理输入时:
%name Test
Run Code Online (Sandbox Code Playgroud)
这里出了什么问题?
Flex/Flex++ 版本为 2.5.35
我正在写一个x86二进制解释器.
目前我正在处理加载可执行文件和共享对象.但是我有些疑惑:
1)动态链接器/加载器是否连接主可执行文件和共享库的.ini部分,以便为进程映像生成一个.ini部分?对于.fini部分?
2)它是否连接了许多符号和字符串表?
3)我对重新安置感到失望.它们应该在二进制加载时或者在调用过程时发生?我想我不明白动态链接器/加载器如何管理重定位.
4)为什么存在.hash和.gnu.hash部分?为什么我需要'哈希'一个符号?
欢迎链接,评论和明显的答案.