【问题标题】:Profiling Rust with execution time for each *line* of code?使用每*行*代码的执行时间来分析 Rust?
【发布时间】:2021-12-10 22:19:19
【问题描述】:

我已经分析了我的 Rust 代码,并看到了一个占用大量时间的处理器密集型函数。由于我不能将函数分解成更小的部分,我希望我能看到函数中的哪一行占用了多少时间。目前我已经尝试过 CLion 的 Rust profiler,但它没有这个功能。

该工具最好在 MacOS 上运行,因为我没有 Windows/Linux 机器(虚拟化除外)。

附: Visual Studio 似乎有这个功能;但我正在使用 Rust。 https://docs.microsoft.com/en-us/visualstudio/profiling/how-to-collect-line-level-sampling-data?view=vs-2017 有:

行级采样是分析器确定处理器密集型函数(例如具有高排他性样本的函数)的代码中处理器必须花费大部分时间的能力。

感谢您的任何建议!


编辑:使用 C++,我确实看到了源代码行级信息。例如,下面的玩具表明,“for”循环在大函数中占用了大部分时间。但我正在使用 Rust...

【问题讨论】:

    标签: performance rust profiling clion profiler


    【解决方案1】:

    一旦编译,Rust 的“行”就不存在了。优化器通过完全重新组织您编写的代码并找到行为与您的预期相同的最小机器代码来完成其工作。

    函数通常是内联的,因此即使测量函数花费的时间也会得出错误的结果 - 或者如果您阻止程序被内联,则会改变程序的性能特征。

    【讨论】:

    • 听起来很合理!但我之前使用的是visual studio's line-level sampling,它似乎运行良好。为什么VS提供这个功能?谢谢!
    • 另外,看this question,似乎传统的perf工具也支持生成行号。我错了吗?
    • 此外,如果我只知道它有 100 行长并且运行缓慢,但对 where 很慢一无所知,我应该如何优化我的功能?谢谢!
    • 系统调用、分配、嵌套循环...在这里很难给出不是很笼统的建议,而且可能不适合。
    • @ch271828n 您在这些工具中看到的行都是猜测。它们可以帮助您确定方向,就像面包屑一样,但它们不是逐行翻译。有时您甚至会看到同一行重复多次,即使您在源代码中只写了一次,因为内联或循环展开。在这个级别上,您必须熟悉阅读程序集并弄清楚它如何映射回您自己的源代码。要尝试的一件事是#inline(never) 函数,然后查看它们的程序集。对于真正的分析,你不会这样做,但它可以给人一种翻译的感觉。
    猜你喜欢
    • 2012-10-20
    • 2020-08-15
    • 2017-04-30
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    相关资源
    最近更新 更多