怎么用源码搭建网站,wordpress 去除右边,平面设计的前景怎么样,网站尺寸java 微型数据库用肉眼看#xff0c;基准测试似乎只是确定执行某些代码需要花费多长时间的简单问题。 但是#xff0c;通常情况下#xff0c;这是幼稚的方法。 提供具有准确和可重复结果的有意义的基准并非易事。 在本文中#xff0c;我们将向您介绍OpenJDK代码工具项目基准测试似乎只是确定执行某些代码需要花费多长时间的简单问题。 但是通常情况下这是幼稚的方法。 提供具有准确和可重复结果的有意义的基准并非易事。 在本文中我们将向您介绍OpenJDK代码工具项目尤其是JMH。 Java Microbenchmarking线束。 我们已经了解了一段时间但是当我们看到它将在Java 9的开发中广泛使用时它再次引起了我们的注意。 基准测试挑战 那么为什么t2-t1的普通计时样式不起作用 除非您正在监视实时系统否则有许多因素可能会影响基准测试结果并使它们无效。 如果您没有使用像JMH这样的标准化基准测试工具结果通常会令人怀疑。 并且不要忘记常识。 最重要的因素是常识 。 通常问题是由特定的系统和VM优化引起的这些优化可能会使结果在一个经过测试的用例中倾斜而在另一个测试用例中不起作用。 为了最好或最坏。 诸如意外的GC预热时间消除死代码各种JIT编译器优化运行时运行方差CPU怪异等问题一直存在。 所有不一定与您要进行基准测试的实际因素相关的因素。 哪个……根据图灵奖获得者Donald Knuth的流行语录创建了这种变体 要更深入地了解JMH如何解决这些问题请查看Aleksey Shipilev的演讲和博客 。 JMH入门 设置您的项目以使用JMH可以通过两种方式完成作为独立项目或者通过使用maven将依赖项添加为现有项目的一部分。 有关说明可在此处的官方页面上找到 。 顺便说一下JMH还支持其他JVM语言例如ScalaGroovy和Kotlin。 设置好环境后就该移到实际的代码了。 JMH是一个注释驱动的框架下面通过一个示例让我们看看它的含义。 基准测试示例比较URL验证 在此测试中我们将比较两种使用Java验证URL的不同方法 1.使用java.net.URL构造函数。 如果构造函数由于URL无效而失败则它将引发MalformedURLException。 为了使测试更加有趣还添加了两个变体将堆栈跟踪深度限制为6种方法并完全取消了堆栈跟踪。 2.使用正则表达式至少可以说是一个非常可怕的正则表达式穆哈哈。 如果该网址不符合该格式则我们认为该网址无效。 结果将帮助我们对这个问题有一个明确的答案因此是时候下注了。 如果您在下面的评论部分中弄错了请告诉我们) 怪物正则表达式 URL验证模式。 它还活着 非常感谢Hardy Ferentschik 他让我们与Takipi博客读者分享了他的用例。 Hardy是RedHat的首席工程师在Hibernate团队工作还是Hibernate Validator的项目负责人。 基准测试的完整源代码可在GitHub上找到 。 我们建议在最接近的选项卡中将其打开并将本节的其余部分用作参考手册。 1.基准设置 BenchmarkMode(Mode.AverageTime)
Warmup(iterations 1)
Measurement(iterations 2)
OutputTimeUnit(TimeUnit.NANOSECONDS) 这是发生了什么的解释 BenchmarkMode 首先选择我们要使用的基准测试模式。 JMH为我们提供了4种不同的模式 吞吐量 AverageTime SampleTime 包括百分位数和SingleShotTime 一次运行一个方法。 这些的任何组合也是完全合法的。 Warmup迭代次数 1 预热迭代次数。 Measurement迭代次数 2 实际测量迭代次数。 在此示例基准测试中我们进行了2次迭代然后取平均分。 OutputTimeUnitTimeUnit.NANOSECONDS 输出结果的时间单位即对您有意义的java.util.concurrent.TimeUnit的任何值。 2.基准范围–初始状态 完成设置后我们需要设置基准的初始状态。 在这种情况下它包括我们将要测试的URL正则表达式测试的类和URL构造函数测试的类。 这些类中的每一个都应使用StateScope.Benchmark进行注释。 另外对于URL列表请注意Param批注用于将不同的值提供给基准 State(Scope.Benchmark)public static class URLHolder {Param(value {// should matchhttp://foo.com/blah_blah,http://142.42.1.1:8080/,http://例子.测试,// should not matchhttp//foo/,///a,:// should fail})String url;
} 3.基准代码 现在我们已经设置好配置和初始状态我们可以前进到实际的基准代码了。 Benchmark
Fork(1)
public boolean regExp(ValidateByRegExp validator, URLHolder urlHolder) {return validator.isValid( urlHolder.url );
} 基准 将此方法标记为基准。 叉1 要运行的试验次数。 每次运行都在不同的JVM中开始。 通过此批注您还可以提供要包含在测试中的JVM参数。 因此对于有限的堆栈跟踪测试我们看到正在使用Forkvalue 1jvmArgs “ -XXMaxJavaStackTraceDepth 6” 。 4.运行测试 使用选项模式 public static void main(String[] args) throws Exception {Options opt new OptionsBuilder().include( .* URLConstraintBenchmark.class.getSimpleName() .* ).build();new Runner( opt ).run();
} **这绝不是一个完整的指南只是一个快速的教程可以帮助您熟悉这些概念。 有关完整的示例集请在此处查看官方的OpenJDK示例代码。 结果 如果您感到好奇请以纳秒为单位报告结果。 是时候看看您的赌注是否正确了。 前3个网址合法下3个网址无效 我们看到如果这是一个有效的URL则验证的正则表达式是非常糟糕的。 在我们所有的有效网址中它收到的效果最差。 另一方面我们看到如果URL无效则表将旋转并且正则表达式将获得最佳结果。 在URL构造器方面我们看不到有效URL的显着差异。 每种变体都提供几乎相同的结果领先于正则表达式。 对于添加了MalformedURLException的无效URL还有另一件事需要考虑异常的堆栈跟踪。 相对于干净尚可怕的正则表达式版本降低了操作速度。 那么最好的选择是什么 假设您的大多数数据都将包含有效的URL则URL构造函数的工作方式将是最好的。 尽管在某些情况下使用正则表达式可能会更好但是如果您假设绝大多数URL都是无效的。 谁使用JMH对其代码进行基准测试 首先JMH被构建为OpenJDK项目的内部代码工具。 正如Oracle Java性能专家JMH项目负责人Aleksey Shipilev告诉我们的那样 “ JMH摸索着自己的痒OpenJDK本身的性能工作。 因此我们有许多功能特定的基准用于评估开发中代码的性能。 JMH驱动的基准测试报告了许多性能错误以展示我们所看到的行为并提供简单的测试用例来验证JDK更改。” 正如我们所讨论的由于基准测试的准确性主要取决于它如何处理系统行为的各种优化和变化因此没有比OpenJDK团队更好的团队来构建这种工具。 构建JVM的团队相同其中包括大多数有用的至今还很难进行基准测试优化。 由于开发JMH的团队非常接近基础VM因此它比其他工具更受青睐并且可以在许多Java和Scala库和工具中使用。 一些著名的示例包括Twitter的Fingale和供生产使用 的其他 实用程序 Jersey Square Okio 各种Apache项目Hibernate等。 最后的想法 像许多其他核心Java问题一样当涉及基准测试时OpenJDK团队和资源通常是寻找答案的最佳场所。 JMH是一种易于使用的替代方法可替代自家种植且大多是错误的微基准。 尽管这绝不会使您摆脱常识来确保基准正确 我们希望您发现该资源有用并将继续探索使用JMH创建有意义的基准并与Java社区共享您的发现。 本周我们还要分享在塔基皮Takipi取得的一些新进展。 如果您还没有看到实际的效果那么这里是您入门所需的一切 。 翻译自: https://www.javacodegeeks.com/2015/11/java-9-code-tools-a-hands-on-session-with-the-java-microbenchmarking-harness.htmljava 微型数据库