问题标签 [benchmarking]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
472 浏览

performance - 虚拟机中基准测试的可信度?

与真实硬件相比,在虚拟机中执行的基准测试的可信度如何?

让我们剖析一个具体的情况。假设我们想要对最近代码更改的性能影响进行基准测试。为简单起见,假设工作负载完全受 CPU 限制(尽管 IO 限制和混合工作负载也很重要)。假设这台机器在 VirtualBox 下运行,因为它是最好的;)

假设我们测量了原始代码和新代码,新代码速度提高了 5%(在虚拟机中进行基准测试时)。我们是否可以有把握地声称它在真实硬件上也至少会快 5%?

更重要的是,假设新代码慢了 3%。我们能否完全确定在真正的硬件上它会慢 3% 或更少,但绝对不会低于3%?

更新:我最感兴趣的是你的战场结果。IE。你能见证一个例子,在虚拟机中慢 10% 的代码在真铁上执行快 5%,反之亦然?还是它总是一致的(即如果它在 VM 中更快/更慢,它在真实机器上总是成比例地更快/更慢)?到目前为止,我的或多或少是一致的;至少,总是朝着同一个方向前进。

0 投票
13 回答
14223 浏览

java - 秒表基准测试是否可以接受?

有没有人使用过秒表基准测试,还是应该始终使用性能工具?是否有任何适用于 Java 的好的免费工具?你用什么工具?

为了澄清我的担忧,秒表基准测试会因操作系统调度而出错。在您的程序的给定运行中,操作系统可能会在您正在计时的功能中间安排另一个(或多个)进程。在 Java 中,如果您尝试为线程应用程序计时,情况会更糟,因为 JVM 调度程序会在混合中加入更多随机性。

基准测试时如何解决操作系统调度问题?

0 投票
3 回答
6147 浏览

gcc - LLVM vs GCC MIPS 代码生成,有什么基准吗?

我很想知道 MIPS 代码、GCC 或 LLVM 的“最佳”免费/OSS 编译器是什么,或者有什么比这些更好的吗?

我有兴趣了解更多关于快速和内存受限生成的汇编代码而不是代码大小的信息。

换句话说,llvm-opt 是否比 gcc -O3 做得更好?

0 投票
4 回答
2467 浏览

c# - 为什么缓存的正则表达式优于已编译的正则表达式?

这只是一个满足我好奇心的问题。但对我来说这很有趣。

我写了这个简单的小基准。它以随机顺序调用 3 种 Regexp 执行变体几千次:

基本上,我使用相同的模式但以不同的方式。

  1. 你的普通方式没有任何RegexOptions。从 .NET 2.0 开始,这些不会被缓存。但应该被“缓存”,因为它被保存在一个相当全局的范围内而不是重置。

  2. RegexOptions.Compiled

  3. 通过调用Regex.Match(pattern, input)在 .NET 2.0 中缓存的静态

这是代码:

每次我调用它时,结果都是这样的:

所以你有它。不多,但大约有 7-8% 的差异。

这不是唯一的谜。我无法解释为什么第一种方法会慢得多,因为它永远不会重新评估,而是保存在全局静态变量中。

顺便说一句,这是在 .Net 3.5 和 Mono 2.2 上,它们的行为完全相同。在 Windows 上。

那么,任何想法,为什么编译的变体甚至会落后?

编辑1:

修复代码后,结果现在如下所示:

这几乎也淘汰了所有其他问题。

感谢您的回答。

0 投票
16 回答
21661 浏览

performance - 谷歌分析有性能开销吗?

谷歌分析在多大程度上影响性能?

我正在寻找以下内容:

  • 基准(包括响应时间/页面加载时间等)
  • 与类似基准的链接或结果

在您的网站上测试 Google Analytics (GA) 的一种(可能)方法:

  1. 从您自己的服务器上提供 ga.js(Google Analytics JavaScript 文件)。
  2. 从 Google Daily(测试 1)和 Weekly(测试 2)更新。

我很想看看这如何减少客户端网络服务器和 GA 服务器之间的通信。

有人做过这些测试吗?如果是这样,你能提供你的结果吗?如果没有,有没有人有更好的方法来测试使用 GA 的性能影响(或缺乏)?

0 投票
11 回答
3667 浏览

c++ - 如何正确地对 [模板化] C++ 程序进行基准测试

<背景>

我正处于我真正需要优化 C++ 代码的地步。我正在编写一个用于分子模拟的库,我需要添加一个新功能。过去我已经尝试添加此功能,但后来我使用了嵌套循环中调用的虚函数。我对此有不好的感觉,第一次实施证明这是一个坏主意。然而,这对于测试这个概念来说是可以的。

</背景>

现在我需要这个功能尽可能快(没有汇编代码或 GPU 计算,这仍然必须是 C++ 并且比更少的可读性更强)。现在我对模板和类策略有了更多的了解(来自 Alexandrescu 的优秀书籍),我认为编译时代码生成可能是解决方案。

但是,在将设计实现到库中之前,我需要对其进行测试。问题是关于测试此新功能效率的最佳方法。

显然我需要打开优化,因为没有这个 g++(可能还有其他编译器)会在目标代码中保留一些不必要的操作。我还需要大量使用基准测试中的新特性,因为 1e-3 秒的 delta 可以决定设计的好坏(这个特性在实际程序中会被调用百万次)。

问题是 g++ 在优化时有时“太聪明了”,如果它认为计算的结果从未被使用过,它可以删除整个循环。在查看输出汇编代码时,我已经看到过一次。

如果我向标准输出添加一些打印,编译器将被迫在循环中进行计算,但我可能主要对 iostream 实现进行基准测试。

那么如何对从库中提取的小特征进行正确的基准测试呢?相关问题:在一个小单元上进行这种体外测试是正确的方法还是我需要整个背景?

感谢您的建议!


似乎有几种策略,从允许微调的编译器特定选项到更通用的解决方案,这些解决方案应该适用于每个编译器,如volatileor extern

我想我会尝试所有这些。非常感谢您的所有回答!

0 投票
18 回答
25381 浏览

.net - 如何测量 .NET 中的代码性能?

我正在使用 DateTime 对一行 C# 代码进行一些真正快速而肮脏的基准测试:

问题在于结果:

...等等。

鉴于开始时间和结束时间相同,Ticks 显然不够精细。

那么,我怎样才能更好地衡量性能呢?

0 投票
3 回答
6530 浏览

ruby-on-rails - 是否有比较 django、rails 和 PHP 框架各自的内存使用情况的基准?

我必须在 RAM 有限(1 GB,无交换)的嵌入式服务器上运行具有许多服务的 Web 服务器。最多有 100 个用户。我将提供诸如论坛、小游戏(javascript 或 flash)等服务。

我的团队非常了解 Ruby on Rails,但我有点担心 Rails 的内存使用情况。我真的不想在这里开始一个巨魔,但我想知道是否有比较 Rails、Django、CakePHP 或任何其他 PHP 框架的任何严肃的(即记录的)基准?

您能否指出基准或就 Rails 的内存使用情况给我您的意见?请请不要巨魔。

0 投票
3 回答
1064 浏览

.net - 依赖注入启动性能

我最近被要求解决使用 Microsoft 的 Composite UI Application 块构建的应用程序中的一些性能问题 - 特别是加载时间过长。

这是围绕 Microsoft 的 ObjectBuilder 依赖注入框架构建的,该框架使用反射/属性来注册类。分析表明,在启动时,应用程序花费大量时间进行反射,因为 ObjectBuilder 会扫描每个加载程序集中的每个类型,以搜索要注册的内容。

替代 DI 框架似乎也都使用属性、XML 配置或纯代码。
似乎没有任何其他基于属性的框架会更好,而且我对必须解析成堆的 XML 等的启动时间持怀疑态度。
基于纯代码的框架似乎应该快得多,但它们的灵活性也低得多,所以看起来并不是一个明确的好选择......

这导致我搜索 DI 容器基准,但我唯一能找到的是这个: http: //www.codinginstinct.com/2008/04/ioc-container-benchmark-unity-windsor.html
虽然它是一个很好的基准,但它只衡量使用容器创建 100 万个对象的速度。我对创建 100 万个对象没有兴趣,我只是希望应用程序尽快启动,所以我正在寻找有关 DI Container启动的任何信息成本的任何信息,无论是博客文章、轶事,甚至是诸如就像“这是一种使 ObjectBuilder 更快的方法”一样简单。

提前致谢

0 投票
4 回答
310 浏览

performance - 第二次运行托管应用程序显示的性能与第一次不同

我有一个基准测试应用程序来测试我编写的一些 API 的性能。在这个基准测试应用程序中,我基本上使用 QueryPerformanceCounter 并通过将调用 API 前后 QPC 值的差异除以频率来获取时间。但是如果我从不同的驱动器运行应用程序(在同一组 Dll 上运行的相同可执行文件),基准测试结果似乎会有所不同。此外,在特定驱动器上,第一次运行应用程序、关闭应用程序并再次运行它会产生不同的基准测试结果。谁能解释这种行为?我在这里错过了什么吗?

一些更有用的信息:

行为是这样的:运行应用程序,关闭它并再次运行它,基准测试结果似乎在第二次运行时有所改善,此后保持不变。这种行为在从 C 盘运行的情况下更加突出。我还想提一下,我的基准应用程序可以选择重新运行/重新测试特定的 API,而无需关闭应用程序。我确实知道这涉及到 jitting,但我不明白的是,在第一次运行应用程序时,当您在不关闭应用程序的情况下多次重新运行 API 时,性能在运行几次后稳定下来,然后当您关闭并重新运行时同样的测试,性能似乎有所提高。

此外,您如何考虑从不同驱动器运行时的性能变化?

[信息更新]

我做了一个ngen,现在来自同一位置的不同运行之间的性能差异消失了。即如果我打开基准应用程序,运行一次,关闭它并从同一位置重新运行它,它会显示相同的值。

但是我现在遇到了另一个问题。当我从 D 驱动器启动应用程序并运行它几次(在同一启动基准程序中的 API 迭代几次),然后从第 3 次迭代开始,所有 API 的性能似乎下降了 20% 左右. 然后,如果您关闭并重新启动应用程序并运行它,对于前 2 次迭代,它会给出正确的值(与从 C 获得的值相同),然后性能再次超出该值。从 C 盘运行时看不到此行为。从 C 盘开始,无论您运行多少次,它都非常一致。

我正在使用大型双数组来测试我的 API 性能。我担心 GC 会在测试之间启动,所以我在每次测试之前和之后都明确地调用 GC.Collect() 和 GC.WaitForPendingFinalizers()。所以我认为这与GC无关。

我尝试使用 AQ 时间来了解从第 3 次迭代开始发生了什么,但有趣的是,当我使用 AQ 时间分析它运行应用程序时,性能根本没有下降。

性能计数器 as 不建议任何有趣的 IO 活动。

谢谢尼兰詹