我看到术语软件基准测试和 profiling 有时可以互换使用,但据我的理解,这是一个微妙的差异。
两者都是按时间连接的。但是,虽然基准测试主要是确定可以与其他应用程序进行比较的特定速度分数,但分析可以为您提供有关应用程序在大部分时间(或循环次数)上花费的确切信息。
对我来说,它总是如下:集成测试是基准测试和单元测试对应的分析测试的对应物。但微基准测试如何适用于此?
有人说here:
分析和基准测试是同一个硬币的另一面,分析可以帮助您缩小到最有用的地方,基准测试可以让您轻松地隔离优化并对它们进行交叉比较。
另一个人说here关于分析:
分析在不同时间意味着不同的东西。有时它意味着衡量绩效。有时它意味着诊断内存泄漏。有时它意味着可以看到多线程或其他低级别活动。
那么,这些技术在概念上是不同的还是不是那种黑白?
答案 0 :(得分:16)
基准测量可以衡量整个操作的时间。例如某些工作负载下每秒的I / O操作数。所以结果通常是一个数字,以秒或每秒操作。或者包含不同参数结果的数据集,因此您可以绘制图形。
您可以使用基准测试来比较不同硬件上的相同软件,或基准测试与之交互的其他软件的不同版本。例如使用不同的apache设置每秒进行基准最大连接数。
分析不是为了比较不同的东西:它是关于理解程序的行为。 个人资料结果可能是每个功能的时间表,或even per instruction with a sampling profiler。你可以告诉它一个简介不是一个基准,因为说#34;这个功能花费的时间最少,所以我们保留那个并且停止使用其余的"
阅读维基百科文章以了解有关它的更多信息:https://en.wikipedia.org/wiki/Profiling_(computer_programming)
您使用配置文件来确定优化位置。在你的程序花费99%的时间的函数中,10%的加速比在任何其他函数中的100%加速更有价值。更好的是,当您可以改进高级设计时,可以减少昂贵的功能,并使其更快。
Microbenchmarking 是一种特定的基准测试形式。这意味着你要测试一个超级特定的东西来单独衡量,不任何真正有用的东西的整体表现。
微基准测试结果示例:
mov eax, ecx
has 0c latency on Haswell, but mov ecx, ecx
has 1c latency。 (mov-elimination仅适用于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。在这种情况下,您需要对微型基准进行分析,以了解使其以此速度运行的原因。 (通常你对ups_executed的perf计数器比对实际时间或时钟周期计数更感兴趣,例如测试微融合/非层压而不需要制造实际影响周期的循环迭代。)
非微观基准测试结果示例:
另见https://en.wikipedia.org/wiki/Benchmark_(computing)#Types_of_benchmarks。
微基准测试是基准测试的一个特例。如果你做得对,它会告诉你哪些操作很昂贵,哪些操作很便宜,这有助于你在尝试优化时。如果你做错了,你甚至可能根本没有衡量你想要衡量的东西。例如你写了一些C来测试循环与while循环,但编译器因不同的原因制作了不同的代码,你的结果毫无意义。 (表达相同逻辑的不同方式对于现代优化编译器几乎无关紧要;不要在此基础上浪费时间。)微基准测试很难。
另一种告诉它微观基准的方法是,你通常需要查看编译器的asm输出,以确保它能够测试你想要测试的内容。 (例如,它没有通过在循环中提升昂贵的东西来重复你的重复-10M次循环的迭代,这应该重复整个操作足够的时间以给出可以准确测量的持续时间。 )
微基准测试可能会扭曲事物,因为它们会通过热门缓存和分支预测器来测试您的功能,并且它们不会在被测代码的调用之间运行任何其他代码。这可以使巨大的循环展开看起来很好,当作为真实程序的一部分时,它会导致更多的缓存未命中。类似地,它使大的查找表看起来很好,因为整个查找表最终在缓存中。完整的程序通常会在对查找表并不总是在缓存中命中的函数的调用之间弄脏足够的缓存,因此计算某些东西会更便宜。 (大多数程序都受内存限制。重新计算不太复杂的东西通常和查找它一样快。)
答案 1 :(得分:2)
通常人们会分析不是为了衡量一个程序的速度,而是为了找出如何让它更快。
他们通常会假设通过测量特定函数或代码行所花费的时间来最好地找到慢度。
有一个明确的方法可以考虑这个问题:如果一个函数或一行代码显示包含百分比的时间,那么就是在函数或行中保存的时间的一小部分。可以使代码占用零时间(通过不执行它或将其传递给无限快速的处理器)。
除了函数或代码行之外还有其他一些东西可能需要时间。 这些是描述程序正在做什么,但它们不是唯一的描述。
假设您运行一个分析器,每N秒实际时间(不仅仅是CPU时间)收集程序状态的样本,包括调用堆栈和数据变量。 调用堆栈不仅仅是一堆函数名称 - 它是一组调用这些函数的调用站点,通常是参数值。 然后假设你可以检查和描述每一个。
例如,样本的描述可能是:
当需要这样的事情时,例程X正处于分配记忆的过程中,目的是通过常规Q初始化用于记录患者的字典。
程序正在读取一个dll文件的过程,目的是提取一个字符串资源,在调用堆栈的几个级别,将用于填充存在的进度条中的文本字段来告诉用户为什么节目花了这么长时间:)
程序使用某些参数调用函数F,并且它先前使用相同的参数调用它,给出相同的结果。这表明人们可以记住先前的结果。
程序正在调用函数G,它正在调用函数H只是为了解密G的参数选项标志。程序员知道那些标志总是一样的,这表明G的特殊版本会节省那个时间。
等。等
这些是可能的描述。 如果它们占F%的时间,那就是每个样本符合该描述的概率。 更简单的描述是:
大多数探查器工具仅提供这些简单描述。 一些程序员理解检查样本本身的价值,因此他们可以对程序花费时间的原因进行更多的语义描述。 如果目标是准确地测量由于特定描述而导致的时间百分比,则必须检查大量样本。 但是如果描述出现在小个样本的很大一部分上,那么一个人没有准确地测量它,但是人们知道它很大,并且它已经准确地找到了。 看到不同? 您可以将测量精度与加速发现的功率进行权衡。
这是random pausing背后的原则,统计理由是here。
答案 2 :(得分:1)
基准测试可以帮助您观察系统在负载下的行为, 确定系统的容量,了解哪些变化很重要,或者 了解您的应用程序如何使用不同的数据。
分析是衡量和分析时间的主要手段 被消耗了。分析需要两个步骤:测量任务和时间 已经过去,并对结果进行聚合和排序,以便重要 任务泡沫到顶部。 - here
我的理解是:基准是了解您的应用程序的衡量标准,而性能分析是用于改进您的应用程序的措施。