问题标签 [microbenchmark]
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.
java - 如何在 Java 中编写正确的微基准测试?
您如何在 Java 中编写(和运行)正确的微基准测试?
我正在寻找一些代码示例和注释来说明要考虑的各种事情。
示例:基准测试应该测量时间/迭代还是迭代/时间,为什么?
c - 耗尽 Intel Core 2 Duo 的指令流水线?
我正在为 C 中的一些非常短的操作编写一些微基准测试代码。例如,我正在测量的一件事是根据传递的参数数量调用一个空函数需要多少个周期。
目前,我在每次操作之前和之后使用 RDTSC 指令进行计时,以获取 CPU 的循环计数。但是,我担心在第一个 RDTSC 之前发出的指令可能会减慢我正在测量的实际指令。我还担心在第二个 RDTSC 发布之前,完整的操作可能还没有完成。
有谁知道在发出任何新指令之前强制所有正在进行的指令提交的 x86 指令?我被告知 CPUID 可能会这样做,但我一直无法找到任何这样说的文档。
java - 为什么对同一方法的两次连续调用会产生不同的执行时间?
这是一个示例代码:
}
这给出了以下输出: 100 'fOne' 花费的时间 ... 390273 100 'fTwo' 花费的时间 ... 118451 100 'fOne' 花费的时间 ... 53359 100 'fTwo' 花费的时间 ... 115936按任意键继续 。. .
为什么第一次执行相同的方法比连续调用需要更多的时间(明显更多)?
我尝试给-XX:CompileThreshold=1000000
命令行,但没有区别。
java - 第一次 Java 循环运行缓慢,为什么?[太阳热点 1.5,sparc]
在 Solaris SPARC 机器上对一些 Java 代码进行基准测试时,我注意到我第一次调用基准测试函数时,它的运行速度非常慢(相差 10 倍):
- 第一 | 1 | 25295.979 毫秒
- 第二 | 1 | 2256.990 毫秒
- 第三| 1 | 2250.575 毫秒
为什么是这样?我怀疑 JIT 编译器,有没有办法验证这一点?
编辑:根据一些答案,我想澄清一下,这段代码是我能找到的表现这种行为的最简单的测试用例。所以我的目标不是让它快速运行,而是要了解发生了什么,这样我就可以在我的实际基准测试中避免它。
已解决: Tom Hawtin 正确地指出我的“慢”时间实际上是合理的。根据这一观察,我将调试器附加到 Java 进程。在第一个过程中,内部循环如下所示:
在以下迭代中,循环如下所示:
因此,HotSpot 从内部循环中移除了内存访问,将其加速了一个数量级。
教训:做数学!我应该自己做汤姆的计算。
基准 Java 代码:
java - 我的 python 程序比我的同一程序的 java 版本执行得更快。是什么赋予了?
更新:2009-05-29
感谢所有的建议和建议。 我使用您的建议使我的生产代码的平均执行速度比几天前的最佳结果快 2.5 倍。 最后,我能够使 java 代码最快。
教训:
我下面的示例代码显示了原始整数的插入,但生产代码实际上是存储字符串(我的错)。当我更正 python 执行时间从 2.8 秒变为 9.6 时。所以马上,java 在存储对象时实际上更快。
但它并不止于此。我一直在执行java程序,如下所示:
java -Xmx1024m 速度测试
但是,如果您将初始堆大小设置如下,您将获得巨大的改进:
这个简单的更改将执行时间减少了 50% 以上。所以我的 SpeedTest 的最终结果是 python 9.6 秒。Java 6.5 秒。
原始问题:
我有以下python代码:
它在我的机器上执行了大约 3.3 秒,但我想让它更快,所以我决定用 java 编程。我假设因为 java 是编译的并且通常被认为比 python 快,所以我会看到一些巨大的回报。
这是java代码:
所以这个java代码和python代码做的事情基本上是一样的。但它在 8.3 秒而不是 3.3 秒内执行。
我从一个真实的例子中提取了这个简单的例子来简化事情。关键元素是我有(set 或 hashSet)最终有很多成员,就像这个例子一样。
以下是我的问题:
为什么我的 python 实现比我的 java 实现快?
有没有比 hashSet (java) 更好的数据结构来保存唯一的集合?
什么会使 python 实现更快?
什么会使java实现更快?
更新:
感谢所有迄今为止做出贡献的人。请允许我添加一些细节。
我没有包含我的生产代码,因为它非常复杂。并且会产生很多干扰。我上面介绍的案例是最简单的。我的意思是java put调用似乎比python set`s add()慢得多。
生产代码的 java 实现也比 python 版本慢 2.5 - 3 倍——就像上面一样。
我不关心 vm 预热或启动开销。我只想比较从我的 startTime 到我的 totalTime 的代码。请不要为其他事情操心。
我用足够多的桶初始化了哈希集,这样它就不必重新哈希了。(我总是会提前知道集合最终将包含多少元素。)我想有人可能会争辩说我应该将它初始化为迭代次数/0.75。但是,如果您尝试一下,您会发现执行时间并没有受到显着影响。
我为那些好奇的人设置了 Xmx1024m(我的机器有 4GB 的内存)。
我正在使用 java 版本:Java(TM) SE Runtime Environment (build 1.6.0_13-b03)。
在生产版本中,我在 hashSet 中存储了一个字符串(2-15 个字符),因此我不能使用原语,尽管这是一个有趣的案例。
我已经多次运行代码。我非常相信 python 代码比 java 代码快 2.5 到 3 倍。
php - 进行简单性能测试的更好方法
在比较操作的性能时,我通常会这样做:
有没有更好的方法来做这些测试,可能是更可靠的方法?似乎如果我多次运行相同的测试,我可以获得截然不同的结果,例如我多次运行上述测试,这就是我得到的。
正如您在每次运行时看到的那样,结果可能大不相同。
java - 在 Java 中对小型数组与列表进行基准测试:我的基准测试代码错了吗?
免责声明:我已经查看了这个问题和这个问题 ,但它们都被小细节和一般优化 - 不必要的问题所困扰。我真的需要在我当前的应用程序中获得的所有性能,它正在实时接收-处理-喷出 MIDI 数据。它还需要尽可能地扩大规模 。
我将array
小列表的大量读取性能与ArrayList
手头的变量进行比较。我发现一个数组的节拍ArrayList
是 2.5 倍,甚至比只有对象引用还要好。
我想知道的是:
- 我的基准还好吗?我已经切换了测试的顺序和运行次数,没有任何变化。我也使用毫秒而不是纳秒无济于事。
- 我应该指定任何 Java 选项来最小化这种差异吗?
- 如果这种差异是真实的,在这种情况下,我不应该更喜欢
Test[]
在ArrayList<Test>
这种情况下并放入转换它们所需的代码吗?显然,我阅读的内容远多于写作。
JVM 是 OSX 上的 Java 1.6.0_17,它肯定在热点模式下运行。
java - Java for 循环性能问题
考虑这个例子:
对比
这会有什么不同吗?在我的机器上,第二个似乎执行得更快,但我不知道它是否真的准确。编译器会优化这段代码吗?如果循环条件是不可变对象(例如字符串数组),我可以认为他会这样做。
assembly - 如何在多核处理器上进行基准测试
我正在寻找在多核处理器上执行微基准测试的方法。
语境:
几乎与此同时,桌面处理器引入了让性能难以预测的乱序执行,也许并非巧合,它们还引入了特殊指令来获得非常精确的时序。这些指令的示例rdtsc
在 x86 和rftb
PowerPC 上。这些指令给出的时间比系统调用所允许的更精确,允许程序员对他们的心进行微基准测试,无论好坏。
在具有多个内核的更现代的处理器上,其中一些内核有时会休眠,计数器在内核之间不同步。我们被告知rdtsc
不再安全地用于基准测试,但是当我们被解释替代解决方案时,我一定是在打瞌睡。
问题:
一些系统可能会保存和恢复性能计数器,并提供 API 调用来读取正确的总和。如果您知道此调用适用于任何操作系统,请在答复中告知我们。
一些系统可能允许关闭核心,只留下一个运行。我知道 Mac OS X Leopard 在从开发人员工具安装正确的首选项窗格时会这样做。你认为这可以rdtsc
安全地再次使用吗?
更多背景:
请假设我在尝试进行微基准测试时知道自己在做什么。如果您认为如果优化的收益不能通过计时整个应用程序来衡量,那么不值得优化,我同意您的观点,但是
在替代数据结构完成之前,我无法为整个应用程序计时,这需要很长时间。事实上,如果微基准没有希望,我现在可以决定放弃实施;
我需要在我无法控制截止日期的出版物中提供数据。
java - 什么是微基准测试?
我听说过这个词,但我不完全确定它是什么意思,所以:
- 它是什么意思,什么不是它的意思?
- 什么是什么是和什么不是微基准测试有哪些例子?
- 微基准测试有哪些危险以及如何避免?
- (或者这是一件好事?)