- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
对于为什么执行 Mockito 模拟所花费的时间如此不稳定,谁能给出解释,甚至更好的建议修复?下面是我能想到的最简单的 SSCCE:
import static org.mockito.Mockito.mock;
public class TestSimpleMockTiming
{
public static final void main (final String args [])
{
final Runnable theMock = mock (Runnable.class);
int tookShort = 0;
int tookMedium = 0;
int tookLong = 0;
int tookRidiculouslyLong = 0;
long longest = 0;
for (int n = 0; n < 2000000; n++)
{
final long startTime = System.nanoTime ();
theMock.run ();
final long duration = System.nanoTime () - startTime;
if (duration < 1000000) // 0.001 seconds
tookShort++;
else if (duration < 100000000) // 0.1 seconds
tookMedium++;
else if (duration < 1000000000) // 1 second !!!
tookLong++;
else
tookRidiculouslyLong++;
longest = Math.max (longest, duration);
}
System.out.println (tookShort + ", " + tookMedium + ", " + tookLong + ", " + tookRidiculouslyLong);
System.out.println ("Longest duration was " + longest + " ns");
}
}
如果我运行它(从 Eclipse 中,在 Win 7 x64 上使用 JDK 1.7.45),典型的输出如下:
1999983, 4, 9, 4
Longest duration was 5227445252 ns
因此,虽然在大多数情况下 mock 的执行速度非常快,但有几个执行时间甚至超过 1 秒。对于什么都不做的方法来说,这是永恒的。从我的实验来看,我不认为问题是 System.nanoTime () 的准确性,我认为模拟确实需要那么长时间才能执行。我可以做些什么来改进这一点并使计时行为更加一致吗?
(仅供引用,为什么这是一个问题是因为我有一个包含各种框架的 Swing 应用程序,我尝试为框架编写 JUnit 测试以便我可以测试布局管理器是否正确运行而不必启动整个应用程序并导航到正确的屏幕。在一个这样的测试中,屏幕使用 javax.swing.Timer 来实现滚动,因此当鼠标保持在帧末尾附近时,显示器将在一个区域周围平移。我注意到了这种行为这是非常不稳定的,虽然通常很好的滚动会周期性地卡住一秒钟,看起来很可怕。我围绕这个写了一个 SSCCE,认为问题是不能依赖 Swing Timers 以一致的方式触发率,并在 SSCCE 中完美运行。
经过几个小时的努力,然后试图找出我的真实代码和滚动演示 SSCCE 之间的差异,我开始在重复运行的代码块周围放置纳米计时器,注意到我的 paintComponent 方法所花费的时间非常不稳定并最终将其缩小为模拟电话。从运行真实应用程序测试屏幕,滚动表现流畅,这只是 JUnit 测试的一个问题,因为模拟调用,这导致我单独测试一个简单的模拟与上面发布的 SSCCE。)
非常感谢!
最佳答案
此测试在多个方面存在缺陷。如果你想正确地进行基准测试,我强烈建议使用 JMH ,它是由 Alexey Shipilev 完成的,他比我们聪明得多,而且在 JVM 方面的知识绝对比我们心爱的星球上大多数使用 Java 的人都多。
这是该测试最明显的缺陷。
测试忽略了 JVM 正在做什么,比如预热阶段、编译 C1 和 C2 线程、GC、线程问题(即使这段代码不是多线程的,JVM/OS 可能必须做一些事情否则)等...
测试似乎确实忽略了实际操作系统/JVM/CPU 组合是否提供高达纳秒的正确分辨率。
即使有 System.nanoTime()
,您是否确定 JVM 和操作系统具有正确的分辨率。例如,在 Windows 上,JVM 无法访问真正的纳秒,而是访问某个计数器,而不是挂钟时间。 javadoc声明这一点,这里是片段:
This method can only be used to measure elapsed time and is not related to any other notion of system or wall-clock time. The value returned represents nanoseconds since some fixed but arbitrary origin time (perhaps in the future, so values may be negative). The same origin is used by all invocations of this method in an instance of a Java virtual machine; other virtual machine instances are likely to use a different origin.
This method provides nanosecond precision, but not necessarily nanosecond resolution (that is, how frequently the value changes) - no guarantees are made except that the resolution is at least as good as that of currentTimeMillis().
测试也忽略了 Mockito 的工作原理。
Mockito 将每个调用存储在它自己的模型中,以便能够在执行场景之后验证这些调用。因此,在循环的每次迭代中,Mockito 都会存储另一个调用,最多 2M 个调用,这将影响 JVM(也许模拟实例将保留几代并提升到终身,这对 GC 来说肯定成本更高)。这意味着迭代次数越多,这段代码对 JVM 而不是 Mockito 的压力就越大。
我相信它没有发布(但是在 jcentral 上有开发二进制文件),但是 Mockito 将提供一个设置以允许 mockito 仅 stub 因此它不会存储调用,这可能允许 Mockito 很好地适应这样的场景。
测试缺乏适当的统计分析。
有趣的是,测试代码采用了伪百分位数方法。哪个好!虽然它不是那样工作的,但在这种情况下,它无法解决大问题。相反,它应该记录每一个度量,以便提取 mockito 随着迭代计数的增加所花费的时间的演变趋势。
如果您愿意,最好存储每个记录的测量值,这样就可以将它们提供给适当的统计分析工具,例如 R,以便提取图表、百分位数据等.
关于统计问题,使用 HDRHistogram 肯定会很有趣.当然在微基准测试之外,因为它会影响内存并改变微基准测试的结果。让我们为 JMH 保留它。
如果您更改代码以使用 JMH,则第 1 点和第 2 点都可以解决。
希望对您有所帮助。
关于java - 为什么执行 Mockito 模拟的性能如此不稳定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24983577/
如果输入稳定,我想触发 AJAX 请求(以便不在每个新字符后发送请求)。我尝试了以下方法: $('#input').keyup(function(){ // Get the value when
我读到,我们可以插入以将选择排序更改为稳定排序,而不是交换。我在网上得到了以下相同的实现。 void selection ( int a[], int n ) { while ( --n >
我正在尝试创建一个非常节省空间的不寻常的关联数组实现,我需要一个满足以下所有条件的排序算法: 稳定(不改变具有等键的元素的相对顺序。) 就地或几乎就地(O(log n) 堆栈很好,但没有 O(n) 空
我有一个节点的无线网状网络,每个节点都能够向其邻居报告其“距离”,以(简化的)信号强度来衡量。节点在地理上位于 3d 空间中,但由于 radio 干扰,节点之间的距离不需要在三角(三角?)上一致。即,
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在实现一个玩具调度程序,它读取进程规范(例如到达时间、总运行时间)的输入文件,然后根据随机 io/cpu 突发调度进程。 文件格式 Arrival time, total CPU time, CP
我正在使用 JRedis 的同步实现,但我打算切换到异步方式与 Redis 服务器通信。 但在此之前我想问一下社区 JRedisFuture 是否实现了 alphazero 的 jredis对于生产使
我们正在为我们的公司构建一个RESTful API,它将提供XML,JSON和可能的其他内容类型。 我的团队正在寻找一个框架(按优先顺序排列): 有据可查 理想的情况下,它具有出色的教程以及繁荣的社区
我的网站希望用户上传他们的照片...但我该如何保护我们的服务器免受伤害?只允许 JPG 应该可以避免病毒问题,但如果有人选择 10Gb 文件怎么办 - 这会减慢整个网站的速度吗? 我们使用的是经典 A
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 8 个月前关闭。 Improve this ques
据我所知,paintEvent() 是在 QApplication 对象的“主循环”中执行的,并且可以为其内部系统任务花费时间,从而延迟执行排队槽或其他事件。 但是,如果我需要播放非常流畅的动画并且我
我想对随机排序的 ActiveRecord 模型列表(来自 MySQL 数据库的行)进行分页。 但是,这种随机化需要在每个 session 的基础上持续存在,以便访问该网站的其他人也会收到一个随机的、
在 Flutter Web 稳定后,我尝试按照文档中给出的说明将我的 Flutter Mobile 应用程序转换为 Flutter Web。一切都很好,但这里的问题是 Web 上的文本不可选择!我刚刚
我正在尝试制作一个包含 Nginx stable 最新使用 vts 模块编译的 dockerfile .... 我遇到了一个大问题,当我放入将下载的 docker 文件时我找不到一些汽车链接安装最新的
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我正在使用以下命令将 Airflow 部署到 Kubernetes 中:https://github.com/helm/charts/tree/master/stable/airflow 我正在尝
我已经安装了本地测试elasticsearch和logstash,它们似乎看不到本地es-知道在集群/ ns中如何看到es吗? helm repo add elastic https://helm.e
我最近加入了一家公司,担任发布工程师,在这里,大量的开发团队以各种语言开发了众多服务,应用程序和Web应用程序,它们之间具有各种相互依赖性。 我正在尝试找到一种简化并最好自动发布的方法。当前,发布团队
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我想知道一种在 Windows 上使用简单批处理和 ffmpeg 稳定 goPro 视频的简单方法。 最佳答案 1) 在您的计算机上安装 ffmpeg:按照 steps 安装 2) 在您要处理的视频旁
我是一名优秀的程序员,十分优秀!