当前位置: 首页 > news >正文

网站怎么做后台wordpress 性能怎么样

网站怎么做后台,wordpress 性能怎么样,企业网站营销案例,厦门市建设与管理局 官方网站前言作为软件开发人员#xff0c;我们通常会写一些测试程序用来对比不同算法、不同工具的性能问题。而最常见的做法是写一个main方法#xff0c;构造模拟场景进行并发测试。如果细心的朋友可能已经发现#xff0c;每次测试结果误差很大#xff0c;有时候测试出的结果甚至与… 前言作为软件开发人员我们通常会写一些测试程序用来对比不同算法、不同工具的性能问题。而最常见的做法是写一个main方法构造模拟场景进行并发测试。如果细心的朋友可能已经发现每次测试结果误差很大有时候测试出的结果甚至与事实相反。当然这不排除是因为软硬件环境因素导致但更多的可能是因为所使用测试方法自身有问题。比如不同需要性能比较方法放到一个虚拟机里调用有可能会互相影响缺少预热的过程等。本文给大家推荐一款JDK9及以后自带的一款可用于软件基准测试的工具JMH(Java Microbenchmark Harness)。JMH简介JMH是用于代码微基准测试的工具套件主要是基于方法层面的基准测试精度可以达到纳秒级。何谓Micro Benchmark呢简单的来说就是基于方法层面的基准测试精度可以达到微秒级。当你定位到热点方法希望进一步优化方法性能的时候就可以使用JMH对优化的结果进行量化的分析。这款工具是由Oracle内部实现JIT的作者所写。我们知道JITJava即时编译器是将JVM优化的所有高效手段和技术都使用上的地方。可想而知开发者比任何人都更加了解JVM和JIT对基准测试的影响。因此这款工具是值得我们信赖和在实践中进行使用的。而且使用起来也非常方便。使用场景JMH不仅能帮我们测试一些常见类的性能比如对比StringBuffer和StringBuilder的性能、对比不同算法的在不同数据量的性能等还能够帮助我们对系统中发现的热点代码进行量化分析。JMH通常用于以下应用场景测试某个方法在稳定执行的情况下所需时间以及执行时间和问题规模的相关性对比接口不同实现在给定条件下的吞吐量查看多少百分比的请求在多长时间内完成使用实例依赖引入如果你使用的是JDK9或以上版本则JDK中已经自带了该工具直接使用即可。如果你使用的是其他版本则可以通过maven直接引入以下依赖dependencygroupIdorg.openjdk.jmh/groupIdartifactIdjmh-core/artifactIdversion1.27/version /dependency dependencygroupIdorg.openjdk.jmh/groupIdartifactIdjmh-generator-annprocess/artifactIdversion1.27/version /dependency 其中1.27是当前的最新版本可根据实际需要更新或降低版本。测试案例下面以StringBuffer和StringBuilder的性能测试对比为例来进行基准测试。//使用模式 默认是Mode.Throughput BenchmarkMode(Mode.AverageTime) // 配置预热次数默认是每次运行1秒运行10次这里设置为3次 Warmup(iterations  3, time  1) // 本例是一次运行4秒总共运行3次在性能对比时候采用默认1秒即可 Measurement(iterations  3, time  4) // 配置同时起多少个线程执行 Threads(1) //代表启动多个单独的进程分别测试每个方法这里指定为每个方法启动一个进程 Fork(1) // 定义类实例的生命周期Scope.Benchmark所有测试线程共享一个实例用于测试有状态实例在多线程共享下的性能 State(value  Scope.Benchmark) // 统计结果的时间单元 OutputTimeUnit(TimeUnit.NANOSECONDS) public class JmhTest {Param(value  {10, 50, 100})private int length;public static void main(String[] args) throws RunnerException {Options opt  new OptionsBuilder().include(JmhTest.class.getSimpleName()).result(result.json).resultFormat(ResultFormatType.JSON).build();new Runner(opt).run();}Benchmarkpublic void testStringBufferAdd(Blackhole blackhole) {StringBuffer sb  new StringBuffer();for (int i  0; i  length; i) {sb.append(i);}blackhole.consume(sb.toString());}Benchmarkpublic void testStringBuilderAdd(Blackhole blackhole) {StringBuilder sb  new StringBuilder();for (int i  0; i  length; i) {sb.append(i);}blackhole.consume(sb.toString());} } 上面介绍概念时已经提到Benchmark为基准测试在使用中只需对要测试的方法添加Benchmark注解即可。而在测试类JmhTest指定测试的预热、线程、测试维度等信息。main方法中通过OptionsBuilder构造测试配置对象Options并传入Runner启动测试。这里指定测试结果为json格式同时会将结果存储在result.json文件当中。执行测试执行main方法控制台首先会打印出如下信息# JMH version: 1.27 # VM version: JDK 1.8.0_271, Java HotSpot(TM) 64-Bit Server VM, 25.271-b09 # VM invoker: /Library/Java/JavaVirtualMachines/jdk1.8.0_271.jdk/Contents/Home/jre/bin/java # VM options: -javaagent:/Applications/IntelliJ IDEA.app/Contents/lib/idea_rt.jar56800:/Applications/IntelliJ IDEA.app/Contents/bin -Dfile.encodingUTF-8 # JMH blackhole mode: full blackhole  dont-inline hint # Warmup: 3 iterations, 1 s each # Measurement: 3 iterations, 4 s each # Timeout: 10 min per iteration # Threads: 1 thread, will synchronize iterations # Benchmark mode: Average time, time/op # Benchmark: com.choupangxia.strings.JmhTest.testStringBufferAdd # Parameters: (length  10) 这些信息主要用来展示测试的基本信息包括jdk、JVM、预热配置、执行轮次、执行时间、执行线程、测试的统计单位等。# Warmup Iteration   1: 76.124 ns/op # Warmup Iteration   2: 77.703 ns/op # Warmup Iteration   3: 249.515 ns/op 这是对待测试方法的预热处理这部分不会记入测试结果。预热主要让JVM对被测代码进行足够多的优化比如JIT编译器的优化。Iteration   1: 921.191 ns/op Iteration   2: 897.729 ns/op Iteration   3: 890.245 ns/opResult com.choupangxia.strings.JmhTest.testStringBuilderAdd:903.055 ±(99.9%) 294.557 ns/op [Average](min, avg, max)  (890.245, 903.055, 921.191), stdev  16.146CI (99.9%): [608.498, 1197.612] (assumes normal distribution) 显示每次共3次迭代执行速率最后进行统计。这里是对testStringBuilderAdd方法执行length为100的测试通过 (min, avg, max) 三项可以看出最小时间、平均时间、最大时间的值单位为ns。stdev显示的是误差时间。通常情况下我们只用看最后的结果即可Benchmark                     (length)  Mode  Cnt     Score      Error  Units JmhTest.testStringBufferAdd               10  avgt    3    92.599 ±  105.019  ns/op JmhTest.testStringBufferAdd               50  avgt    3   582.974 ±  580.536  ns/op JmhTest.testStringBufferAdd              100  avgt    3  1131.460 ± 1109.380  ns/op JmhTest.testStringBuilderAdd        10  avgt    3    76.072 ±    2.824  ns/op JmhTest.testStringBuilderAdd        50  avgt    3   450.325 ±   14.271  ns/op JmhTest.testStringBuilderAdd       100  avgt    3   903.055 ±  294.557  ns/op 看到上述结果我们可能会很吃惊我们知道StringBuffer要比StringBuilder的性能低一些但结果发现它们的之间的差别并不是很大。这是因为JIT编译器进行了优化比如当JVM发现在测试当中StringBuffer并没有发生逃逸于是就进行了锁消除操作。常用注解下面对JHM当中常用的注解进行说明以便大家可以更精确的使用。BenchmarkMode配置Mode选项作用于类或者方法上其value属性为Mode数组可同时支持多种Mode如BenchmarkMode({Mode.SampleTime, Mode.AverageTime})也可设为Mode.All即全部执行一遍。org.openjdk.jmh.annotations.Mode为枚举类对应的源代码如下public enum Mode {Throughput(thrpt, Throughput, ops/time),AverageTime(avgt, Average time, time/op),SampleTime(sample, Sampling time),SingleShotTime(ss, Single shot invocation time),All(all, All benchmark modes);// 省略其他内容 } 不同模式之间测量的维度或测量的方式不同。目前JMH共有四种模式Throughput整体吞吐量例如“1秒内可以执行多少次调用”单位为ops/timeAverageTime调用的平均时间例如“每次调用平均耗时xxx毫秒”单位为time/opSampleTime随机取样最后输出取样结果的分布例如“99%的调用在xxx毫秒以内99.99%的调用在xxx毫秒以内”SingleShotTime以上模式都是默认一次iteration是1s只有SingleShotTime是只运行一次。往往同时把warmup次数设为0用于测试冷启动时的性能All上面的所有模式都执行一次Warmup在执行Benchmark之前进行预热操作确保测试的准确性可用于类或者方法上。默认是每次运行1秒运行10次。其中Warmup有以下属性iterations预热的次数Iteration是JMH进行测试的最小单位在大部分模式下一次iteration代表的是一秒JMH会在这一秒内不断调用需要benchmark的方法然后根据模式对其采样计算吞吐量计算平均执行时间等。time每次预热的时间timeUnit时间的单位默认秒batchSize批处理大小每次操作调用几次方法JIT在执行的过程中会将热点代码编译为机器码并进行各种优化从而提高执行效率。预热的主要目的是让JVM的JIT机制生效让结果更接近真实效果。State类注解JMH测试类必须使用State注解不然会提示无法运行。State定义了一个类实例的生命周期作用范围可以类比Spring Bean的Scope。因为很多benchmark会需要一些表示状态的类JMH会根据scope来进行实例化和共享操作。State可以被继承使用如果父类定义了该注解子类则无需定义。由于JMH允许多线程同时执行测试不同的选项含义如下Scope.Thread默认的State该状态为每个线程独享每个测试线程分配一个实例Scope.Benchmark该状态在所有线程间共享所有测试线程共享一个实例用于测试有状态实例在多线程共享下的性能Scope.Group该状态为同一个组里面所有线程共享。OutputTimeUnitbenchmark统计结果所使用的时间单位可用于类或者方法注解使用java.util.concurrent.TimeUnit中的标准时间单位。Measurement度量其实就是实际调用方法所需要配置的一些基本测试参数可用于类或者方法上。配置属性项目和作用与Warmup相同。一般比较重的程序可以进行大量的测试放到服务器上运行。在性能对比时采用默认1秒即可如果用jvisualvm做性能监控可以指定一个较长时间运行。Threads每个进程中同时起多少个线程执行可用于类或者方法上。默认值是Runtime.getRuntime().availableProcessors()根据具体情况选择一般为cpu乘以2。Fork代表启动多个单独的进程分别测试每个方法可用于类或者方法上。如果fork数是2的话则JMH会fork出两个进程来进行测试。JVM因为使用了profile-guided optimization而“臭名昭著”这对于微基准测试来说十分不友好因为不同测试方法的profile混杂在一起“互相伤害”彼此的测试结果。对于每个Benchmark方法使用一个独立的进程可以解决这个问题这也是JMH的默认选项。注意不要设置为0设置为n则会启动n个进程执行测试似乎也没有太大意义。fork选项也可以通过方法注解以及启动参数来设置。Param属性级注解指定某项参数的多种情况特别适合用来测试一个函数在不同的参数输入的情况下的性能只能作用在字段上使用该注解必须定义State注解。Param注解接收一个String数组在Setup方法执行前转化为对应的数据类型。多个Param注解的成员之间是乘积关系譬如有两个用Param注解的字段第一个有5个值第二个字段有2个值那么每个测试方法会跑5*210次。Benchmark方法注解表示该方法是需要进行benchmark的对象用法和JUnit的Test类似。Setup方法注解这个注解的作用就是我们需要在测试之前进行一些准备工作比如对一些数据的初始化之类的。TearDown方法注解与Setup相对的会在所有benchmark执行结束以后执行比如关闭线程池数据库连接等的主要用于资源的回收等。Threads每个fork进程使用多少个线程去执行测试方法默认值是Runtime.getRuntime().availableProcessors()。Group方法注解可以把多个benchmark定义为同一个group则它们会被同时执行譬如用来模拟生产者消费者读写速度不一致情况下的表现。Level用于控制SetupTearDown的调用时机默认是Level.Trial。Trial每个benchmark方法前后Iteration每个benchmark方法每次迭代前后Invocation每个benchmark方法每次调用前后谨慎使用需留意javadoc注释JMH注意事项无用代码消除Dead Code Elimination现代编译器是十分聪明的它们会对代码进行推导分析判定哪些代码是无用的然后进行去除这种行为对微基准测试是致命的它会使你无法准确测试出你的方法性能。JMH本身已经对这种情况做了处理要记住1.永远不要写void方法2.在方法结束返回计算结果。有时候如果需要返回多于一个结果可以考虑自行合并计算结果或者使用JMH提供的BlackHole对象/** This demonstrates Option A:** Merge multiple results into one and return it.* This is OK when is computation is relatively heavyweight, and merging* the results does not offset the results much.*/ Benchmark public double measureRight_1() {return Math.log(x1)  Math.log(x2); } /** This demonstrates Option B:** Use explicit Blackhole objects, and sink the values there.* (Background: Blackhole is just another State object, bundled with JMH).*/ Benchmark public void measureRight_2(Blackhole bh) {bh.consume(Math.log(x1));bh.consume(Math.log(x2)); } 再比如下面代码Benchmark public void testStringAdd(Blackhole blackhole) {String a  ;for (int i  0; i  length; i) {a  i;} } JVM可能会认为变量a从来没有使用过从而进行优化把整个方法内部代码移除掉这就会影响测试结果。JMH提供了两种方式避免这种问题一种是将这个变量作为方法返回值return a一种是通过Blackhole的consume来避免JIT 的优化消除。常量折叠Constant Folding常量折叠是一种现代编译器优化策略例如i 320 * 200 * 32多数的现代编译器不会真的产生两个乘法的指令再将结果储存下来取而代之的它们会辨识出语句的结构并在编译时期将数值计算出来i 2,048,000。在微基准测试中如果你的计算输入是可预测的也不是一个State实例变量那么很可能会被JIT给优化掉。对此JMH的建议是1.永远从State实例中读取你的方法输入2.返回你的计算结果3.或者考虑使用BlackHole对象见如下官方例子State(Scope.Thread) BenchmarkMode(Mode.AverageTime) OutputTimeUnit(TimeUnit.NANOSECONDS) public class JMHSample_10_ConstantFold {private double x  Math.PI;private final double wrongX  Math.PI;Benchmarkpublic double baseline() {// simply return the value, this is a baselinereturn Math.PI;}Benchmarkpublic double measureWrong_1() {// This is wrong: the source is predictable, and computation is foldable.return Math.log(Math.PI);}Benchmarkpublic double measureWrong_2() {// This is wrong: the source is predictable, and computation is foldable.return Math.log(wrongX);}Benchmarkpublic double measureRight() {// This is correct: the source is not predictable.return Math.log(x);}public static void main(String[] args) throws RunnerException {Options opt  new OptionsBuilder().include(JMHSample_10_ConstantFold.class.getSimpleName()).warmupIterations(5).measurementIterations(5).forks(1).build();new Runner(opt).run();} } 循环展开Loop Unwinding循环展开最常用来降低循环开销为具有多个功能单元的处理器提供指令级并行。也有利于指令流水线的调度。例如for (i  1; i  60; i) a[i]  a[i] * b  c; 可以展开成for (i  1; i  60; i3){a[i]  a[i] * b  c;a[i1]  a[i1] * b  c;a[i2]  a[i2] * b  c; } 由于编译器可能会对你的代码进行循环展开因此JMH建议不要在你的测试方法中写任何循环。如果确实需要执行循环计算可以结合BenchmarkMode(Mode.SingleShotTime)和Measurement(batchSize N)来达到同样的效果。参考如下例子/** Suppose we want to measure how much it takes to sum two integers:*/ int x  1; int y  2; /** This is what you do with JMH.*/ Benchmark OperationsPerInvocation(100) public int measureRight() {return (x  y); } JMH可视化在示例的main方法中指定了生成测试结果的输出文件result.json其中的内容就是控制台输出的相关内容以json格式存储。针对json格式的内容可以在其他网站上以图表的形式可视化展示。对应网站JMH Visual Charthttp://deepoove.com/jmh-visual-chart/、JMH Visualizerhttps://jmh.morethan.io/。展示效果如下图img生成jar包执行对于大型的测试一般会放在Linux服务器里去执行。JMH官方提供了生成jar包的方式来执行在maven里增加如下插件pluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-shade-plugin/artifactIdversion2.4.1/versionexecutionsexecutionphasepackage/phasegoalsgoalshade/goal/goalsconfigurationfinalNamejmh-demo/finalNametransformerstransformerimplementationorg.apache.maven.plugins.shade.resource.ManifestResourceTransformermainClassorg.openjdk.jmh.Main/mainClass/transformer/transformers/configuration/execution/executions/plugin /plugins 执行maven的命令生成可执行jar包并执行mvn clean package java -jar target/jmh-demo.jar JmhTest 总结一篇文章几乎涵盖了JMH各方面的知识点如果实践中还没运用赶紧用起来吧你的专业水平将又提升那么一点。当然也可以收藏起来以备不时不需。参考文章https://www.zhihu.com/question/276455629/answer/1259967560 https://www.cnblogs.com/silyvin/p/11736696.html https://blog.csdn.net/wangxuelei036/article/details/105240522 https://www.cnblogs.com/xiang--liu/p/9710143.html 往期推荐 6种快速统计代码执行时间的方法真香!(史上最全)Oracle官方推荐的性能测试工具简单、精准又直观链表竟然比数组慢了1000多倍(动图性能评测)关注我每天陪你进步一点点
http://www.pierceye.com/news/87868/

相关文章:

  • jsp做新闻系统门户网站网站更换空间需要怎么做
  • 企业网站建设合同湖北网站推广策略
  • 公司营销型网站公司个人推广网站
  • 惠州网站建设 英语河北省建设厅网站手机版
  • 网站开发需求表模板一些做的好的网站
  • 免费做网站软件视频郴州网站建设方案策划
  • 网站图片怎么做才有吸引力海南省建设集团有限公司网站
  • 南宁公司的网站建设宁波专业seo外包
  • win7 做网站服务器汝城网站建设
  • 自己怎样做海外网站用dw做的十二星座网站免费
  • 做网站怎么云存储制作闹钟网站
  • 网站常见故障济南网站建设索q479185700
  • 江苏省建设考试信息管理系统网站最新消息深圳龙岗确诊
  • 超市网站建设费用做网站都需要哪些技术
  • 网站策划应该怎么做电子商务网站建设主要内容
  • 网站空间租用哪家好网站做行测题
  • 59网一起做网站百度网页跳转app
  • 台州seo网站推广盐山县招聘网站建设
  • 河南省建设厅网站建设领域涉黑优秀高端网站建设服务商
  • 做直播哪个网站好广州新闻热点事件
  • 做网站的技术注册保险代理公司需要什么条件
  • 涿州市建设局网站国内最好景观设计公司排名
  • 中南建设的网站邢台论坛网
  • 灵璧有做公司网站的吗开网站需要什么流程
  • 网站备案中页面怎么建设菠菜网站
  • 网站设计建设企业久久建筑网企业
  • 凡客建站快车2021给个手机能看的地址
  • 山东网站建设制作公司黄石建设网站公司
  • 个人网站 建设方案书用asp做网站需要准备什么软件
  • 代售网站建设怀柔营销型网站建设