gpt4 book ai didi

c++ - 如何分析 C++ 我自己的共享库

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:27 26 4
gpt4 key购买 nike

我已经创建了一个共享库,现在需要对其进行分析。我现在有两个项目。一个生成共享库,第二个使用它进行测试。

int main() {
cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
MatrixXd frames = creatMatriXdromVtdFile("/home/michael/Dropbox/Java_Workspace/test/frame.vtd");
// MatrixXd frame = frames.row(0).array();
auto start = std::chrono::system_clock::now();
MatrixXd m = demodulateMatrix(frames.data(), frames.rows(), frames.cols());
auto end = std::chrono::system_clock::now();
auto elapsed =
std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();

cout << "Demodulated all data in ";
cout << elapsed;
cout << " us \n";
cout << m.row(1);
return 0;
}

这基本上是第二个项目。使用 gprof 进行分析后,我什至没有在输出中看到 demodulateMatrix 函数。

enter image description here

我如何获取有关共享库内部发生的事情的信息(如何分配内存、哪些函数需要什么时间等)?

最佳答案

gprof 是一个受人尊敬的突破性工具。

但是您会发现它非常有限。它基于对程序计数器的采样,以及计算函数之间的调用,所有这些都与花费时间的因素有着非常微弱的联系。

要找出您的程序中是什么花费了时间,其实很简单。 The method I and others use is this .

重点是,在程序运行时,有一个调用堆栈,由当前程序计数器以及返回线程上当前正在执行的每个函数调用指令的返回地址组成。

如果您可以在随机时间点拍摄调用堆栈的 X-Ray 快照,并在调试器的上下文中检查其所有级别,您可以准确地说出它试图做什么,以及为什么,在那个时间点。

如果它花费 30% 的时间做一些你永远不会猜到但你并不真正需要的事情,你会在 10 个堆栈样本中或多或少的 3 个上发现它,这足以找到它。您不会确切地知道百分比是多少,但您会确切地知道问题是什么。

任何指令花费的时间(如果你去掉它会节省的时间)只是它在堆栈上的时间的百分比,无论它是非调用指令还是调用指令。如果花费足够的时间值得修复,它将出现在适度数量的样本中。

添加:我不想强调这一点,但总有人说“样本太少,它会找到错误的东西!”嗯,好的。假设您对堆栈进行了 10 个随机时间采样,并且您在其中的 3 个上看到了可以去除的东西。它要多少钱?好吧,你不确定。它的概率分布看起来完全像这样:

enter image description here

您可以看到,对于 10/7 = 1.4 倍的加速,最可能的成本是 30%(不足为奇),但它会比这更多或更少。多多少少?好吧,两个阴影区域之间的空白区域有 95% 的概率。换句话说,是的,成本有可能低于 10%,即大约 2.5%。如果成本为 10%,则加速为 10/9 = 1.1 倍。另一方面,对于 10/4 = 2.5 倍的加速,成本高于 60% 的概率相同。

因此估计加速比为 1.4,但尽管它可能低至 1.1,但不要放弃它可能高达 2.5 的同等机会。当然,如果取 20 个样本而不是 10 个,曲线会更窄。

关于c++ - 如何分析 C++ 我自己的共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23777475/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com