有许多静态和动态检测工具。Soot 是 Java 字节码的静态检测工具。Pin 和 Valgrind 是二进制文件的动态检测工具。
静态和动态检测工具的优缺点是什么?我认为静态检测工具在运行时性能方面更好,而动态工具更强大。请比较他们的能力和表现。
另外,使用检测工具与编写 LLVM 通行证有什么区别?
有许多静态和动态检测工具。Soot 是 Java 字节码的静态检测工具。Pin 和 Valgrind 是二进制文件的动态检测工具。
静态和动态检测工具的优缺点是什么?我认为静态检测工具在运行时性能方面更好,而动态工具更强大。请比较他们的能力和表现。
另外,使用检测工具与编写 LLVM 通行证有什么区别?
我假设需要发现需要大量时间的代码,并且您可以优化以节省时间。这是一个与计时程序不同的目标。
我对静态分析器持怀疑态度,因为一切都取决于输入数据组合。
动态检测尝试测量函数的属性,例如:自身时间和总时间、绝对时间、平均值和百分比。还有调用计数,以及每个例程在调用图中的作用。
动态检测(a la gprof)几十年来一直是事实上的标准,但它远不是硬道理。一方面,重要的是要意识到它给你的大多数统计数据都没有抓住你最初的需求。
这些天(恕我直言)您需要一个采样分析器来采样调用堆栈,而不仅仅是程序计数器。它应该在挂钟时间进行采样,而不仅仅是 CPU 时间。不需要以高频率抽取样本。当应用程序等待用户输入时,它应该抑制采样。它应该为您提供行或指令级别的信息,而不仅仅是功能级别。对于一行代码,它应该为您提供的最重要的统计数据是包含它的样本的百分比,因为这是对优化该行可以节省的时间的最直接度量。
一些分析器可以做到这一点,特别是 Oprofile 和 RotateRight/Zoom。
静态检测的优点在于分析不依赖于输入。分析发生在原始代码上,包括代码的所有路径。完全覆盖。这种类型的检测通常会重写准备好执行的二进制文件,而在运行时不需要另一个进程。这也意味着代码将运行得很快,唯一的开销来自注入的代码。静态检测的缺点是由于缺乏运行时信息而导致分析不详细,因此有时很难实现您的目标。
另一方面,动态检测确实包括代码运行时的每个细节和信息。在大多数情况下,执行动态检测的工具很容易编写。另一方面,由于执行路径取决于给定的输入,因此无法实现完整的代码覆盖。此外,需要附加一个外部进程并对原始进程进行检测,这一事实使事情变得更慢。
AFAIC,LLVM 通行证用于静态检测,因为生成的代码是在编译时生成的,并且已经写在最终的二进制文件中,并且肯定包含静态检测技术的所有优点和缺点。
总而言之,这是您需要什么的问题。您应该为您的工作选择合适的工具。