profiling - 基准测试和分析之间的区别

标签 profiling benchmarking

我看到术语软件基准测试和分析有时可以互换使用,但就我的理解而言,存在细微差别。

两者在时间上是相连的。但是,基准测试主要是确定可以与其他应用程序进行比较的特定速度分数,而分析则为您提供有关应用程序大部分时间(或周期数)花费在哪里的准确信息。

对我来说,它总是这样:集成测试是基准测试的对应物,单元测试是分析的对应物。但是微基准测试如何适应这种情况呢?

有人说here :

Profiling and benchmarking are flip sides of the same coin, profiling helps you to narrow down to where optimization would be most useful, benchmarking allows you to easily isolate optimizations and cross-compare them.



另一个说here关于分析:

Profiling means different things at different times. Sometimes it means measuring performance. Sometimes it means diagnosing memory leaks. Sometimes it means getting visibility into multi-threading or other low-level activities.



那么,这些技术在概念上是不同的还是不是黑白分明的?

最佳答案

基准是衡量整个操作时间的东西。例如某些工作负载下每秒的 I/O 操作数。因此 结果通常是单个数字,以秒或每秒操作数为单位 。或者具有不同参数结果的数据集,因此您可以绘制它。
您可以使用基准来比较不同硬件上的相同软件,或者与基准交互的其他软件的不同版本。例如使用不同的 apache 设置对每秒最大连接数进行基准测试。

分析的目的不是比较不同的东西:它是关于理解程序的行为。 分析结果可能是每个函数 even per instruction with a sampling profiler 所用的时间表。您可以说这是一个配置文件而不是基准测试,因为说“该功能花费的时间最少,因此我们将保留该功能并停止使用其余功能”是没有意义的。
阅读维基百科文章以了解更多信息:https://en.wikipedia.org/wiki/Profiling_(computer_programming)
您可以使用配置文件来确定优化的位置。在程序花费 99% 的时间的函数中 10% 的加速比在任何其他函数中的 100% 加速更有值(value)。更好的是,您可以改进高级设计,从而减少调用昂贵的函数,并使其更快。

微基准测试 是一种特定的基准测试形式。这意味着您正在测试一件非常具体的事情来单独衡量它,而不是任何真正有用的东西的整体性能。
示例微基准测试结果:

  • Intel Haswell's L1 cache load-use latency is 4 cycles
  • 这个版本的 memcpy 实现了其他版本 80% 的吞吐量。
  • mov eax, ecx has 0c latency on Haswell, but mov ecx, ecx has 1c latency 。 (移动消除仅适用于 Intel 上的不同寄存器之间)。请参阅该链接以获取静态可执行文件的完整 asm 源,以及通过使用几个不同的循环体运行它来演示 mov-elimination 的性能计数器结果。
    使用 CPU 性能计数器来衡量微基准测试的运行方式是进行实验以了解 CPU 内部如何工作的好方法。有关更多示例,请参阅 How exactly do partial registers on Haswell/Skylake perform? Writing AL seems to have a false dependency on RAX, and AH is inconsistent。在这种情况下,您正在分析您的微基准测试以了解是什么让它以这种速度运行。 (通常,您对像 uops_executed 这样的性能计数器更感兴趣,而不是对实际时间或时钟周期计数,例如测试微融合/非层压,而无需进行实际影响每次迭代周期的循环。 )

  • 非微基准测试结果示例:
  • 使用 7-zip(带有特定选项和硬件)压缩这个 100MB 的文件集合需要 23 秒。
  • 在某些硬件/软件组合上编译 Linux 内核需要 99 秒。

  • 另见 https://en.wikipedia.org/wiki/Benchmark_(computing)#Types_of_benchmarks
    微基准测试是基准测试的一个特例。如果你做对了,它会告诉你哪些操作是昂贵的,哪些是便宜的,这有助于你尝试优化。如果你做错了,你可能甚至根本没有测量你打算测量的东西。例如您编写了一些 C 来测试 for 循环与 while 循环,但是编译器出于不同原因编写了不同的代码,并且您的结果毫无意义。 (对于现代优化编译器,表达相同逻辑的不同方式几乎无关紧要;不要在此上浪费时间。)微基准测试很难。
    另一种判断它是微基准的方法是,您通常需要查看编译器的 asm 输出,以确保它正在测试您希望它测试的内容。 (例如,它没有通过从循环中提升一些昂贵的东西来优化重复 10M 次循环的迭代,这些东西应该重复整个操作足够多的时间以提供可以准确测量的持续时间。)
    微基准测试可能会扭曲事物,因为它们使用缓存热和分支预测器启动来测试您的函数,并且它们在被测代码的调用之间不运行任何其他代码。这可以使巨大的循环展开看起来很好,当作为真实程序的一部分时,它会导致更多的缓存未命中。同样,它使大查找表看起来不错,因为整个查找表最终都在缓存中。完整的程序通常会在调用函数之间弄脏足够的缓存,查找表并不总是在缓存中命中,因此仅计算某些内容会更便宜。 (大多数程序都受内存限制。重新计算不太复杂的东西通常和查找一样快。)

    关于profiling - 基准测试和分析之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34801622/

    相关文章:

    c++ - 如何使用英特尔PIN捕获到阵列的所有负载?

    c++ - 时序运算符+、运算符-、运算符*和运算符/

    c++ - 在 NTFS、FAT、EXT4 上测试写入/读取速度

    .NET 垃圾收集延迟

    java - 分析作为服务运行的 java 应用程序(本地/远程)

    c - 在 C 代码中回归运行时相关降级的最佳方法

    python - 使用 Profile 或 cProfile 我能得到什么

    PHP Getter 和 Setter 性能。性能在这里很重要吗?

    performance - Symfony2 多内核?

    performance - Julia:稀疏矩阵的 View