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

java JMH 学习

JMH 是什么?

JMH(Java Microbenchmark Harness)是一款专用于代码微基准测试的工具集,其主要聚焦于方法层面的基准测试,精度可达纳秒级别。此工具由 Oracle 内部负责实现 JIT 的杰出人士编写,他们对 JIT 及 JVM 在基准测试方面的影响有着深刻的理解。JMH 不仅能够对 Java 语言进行基准测试,还能对运行在 JVM 上的其他语言开展基准测试。
当热点方法被确定,且希望进一步提升方法性能时,可借助 JMH 对优化后的结果进行量化分析。
JMH 具有一些典型的应用场景,如:

  • 精准了解某个方法的执行时间,以及执行时间与输入的相关性;
  • 对比接口不同实现方式在特定条件下的吞吐量;
  • 查看在特定时间段内完成的请求所占比例等。

JMH 在JDK9 中是自带的 在JDK9 之前 我们需要主动的引入下maven包

<dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-core</artifactId><version>1.23</version>
</dependency>
<dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-generator-annprocess</artifactId><version>1.23</version>
</dependency>

让我们来些第一个 JMH 测试代码吧!

package cn.ideamake.im.auth.service;import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Fork;
import org.openjdk.jmh.annotations.Level;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Param;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.results.format.ResultFormatType;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;import com.google.common.collect.Lists;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.TimeUnit;/*** @author Barcke* @version 1.0* @projectName im-auth* @className Test* @date 2024/4/30 16:30* @slogan: 源于生活 高于生活* @description:**/// 用来配置 Mode 选项,可用于类或者方法上,这个注解的 value 是一个数组,可以把几种 Mode 集合在一起执行 比如 @BenchmarkMode({Mode.AverageTime, Mode.SampleTime})
@BenchmarkMode(// 每一次方法执行用的平均时间,每次操作的平均时间,单位为 time/op
//        Mode.AverageTime// 随机取样,最后输出取样结果的分布
//        Mode.SampleTime// 只运行一次,往往同时把 Warmup 次数设为 0,用于测试冷启动时的性能
//        Mode.SingleShotTime// 吞吐量,每秒执行了多少次调用,单位为 ops/timeMode.Throughput// 上面的所有模式都执行一次
//        Mode.All
)
// 预热所需要配置的一些基本测试参数,可用于类或者方法上。一般前几次进行程序测试的时候都会比较慢,所以要让程序进行几轮预热,保证测试的准确性。
@Warmup(// 预热次数iterations = 3// 每次预热的时间, time = 1// 时间单位,默认秒, timeUnit = TimeUnit.SECONDS// 批处理大小,每次操作调用几次方法, batchSize = 100
)
@Measurement(iterations = 5, time = 5)
// 每个测试线程数量,可用于类或者方法上。
@Threads(5)
// 进行 fork 的次数,可用于类或者方法上。如果 fork 数是 3 的话,则 JMH 会 fork 出三个进程来进行测试。
@Fork(3)
// 指定一个对象的作用范围,JMH 根据 scope 来进行实例化和共享操作。@State 可以被继承使用,如果父类定义了该注解,子类则无需定义。由于 JMH 允许多线程同时执行测试
@State(// 默认是 Scope.Benchmark 所有测试线程共享一个实例,测试有状态实例在多线程共享下的性能
//        value = Scope.Benchmark// 线程作用域,每个线程都有自己的实例,每个线程的实例相互独立,不会相互影响value = Scope.Thread// 线程组作用域,线程组内的线程共享一个实例,线程组外的线程不会共享实例,每个线程的实例相互独立,不会相互影响
//        value = Scope.Group
)
// 结果输出时间单位 可用于类或者方法注解
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class Test {private final String KEY = "barcke";private List<String> arrayList;private List<String> linkedList;// 测试参数@Param(value = {"10", "20", "30"})private int length;// @Setup 测试初始化方法 对应在执行测试方法之后调用的可以使用注解 @TearDown 声明@Setup(// 由于我们设置Warmup和Measurement的不同,因此每一个基准测试方法都会被执行若干个批次,如果想要在每一个基准测试批次执行的前后调用方法,则可以将Level设置为Iteration。
//            Level.Iteration// 意味着在每一个批次的度量过程中,每一次对基准方法的调用前都会执行套件方法。
//            Level.Invocation// Setup和TearDown默认的配置,该套件方法会在每一个基准测试方法的所有批次执行的前后被执行。Level.Trial)public void setup() {arrayList = Lists.newCopyOnWriteArrayList();linkedList = new LinkedList<>();}// Benchmark 用于 测试方法声明@Benchmarkpublic List<String> arrayListAdd() {for (int i = 0; i < length; i++) {arrayList.add(KEY);}return arrayList;}// Benchmark 用于 测试方法声明@Benchmarkpublic List<String> linkedListAdd() {for (int i = 0; i < length; i++) {linkedList.add(KEY);}return linkedList;}public static void main(String[] args) throws RunnerException {Options opt = new OptionsBuilder()// 要导入的测试类.include(Test.class.getSimpleName())// 输出测试结果的文件.result("result.json").resultFormat(ResultFormatType.JSON).build();new Runner(opt).run();}}

需要进行测试的方法会用@Benchmark 注解来标识,关于这些注解的详细含义,将在后续内容中进行具体阐述。
在 main()函数中,首先会对测试用例进行相应的配置。通过采用 Builder 模式来配置测试,将配置的各项参数存入 Options 对象中,然后再利用该 Options 对象来构建 Runner 并启动测试。

使用Main方法执行测试

需注意!!!
idea执行基准测试过程中可能会出现内存泄露的报错:java.lang.OutOfMemoryError: Java heap space
加大JVM的内存参数值即可
如:
image
image

做好准备工作后,开始运行代码,静待片刻,测试结果就会出炉,下面对结果做一个简单的分析:
image

image

image
最终结果:
image

可视化 JMH 工具

JMH Visual Chart:http://deepoove.com/jmh-visual-chart/
JMH Visualizer:https://jmh.morethan.io/

将json文件导入到网站中则可以得到可视化图表数据
image

我跑出来的json数据 不过吞吐量没有啥区别~

[{"jmhVersion" : "1.23","benchmark" : "cn.ideamake.im.auth.service.Test.arrayListAdd","mode" : "thrpt","threads" : 5,"forks" : 3,"jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home/jre/bin/java","jvmArgs" : ["-javaagent:/Users/jeyyu/Applications/IntelliJ IDEA Ultimate.app/Contents/lib/idea_rt.jar=61534:/Users/jeyyu/Applications/IntelliJ IDEA Ultimate.app/Contents/bin","-Dfile.encoding=UTF-8"],"jdkVersion" : "1.8.0_261","vmName" : "Java HotSpot(TM) 64-Bit Server VM","vmVersion" : "25.261-b12","warmupIterations" : 3,"warmupTime" : "1 s","warmupBatchSize" : 100,"measurementIterations" : 5,"measurementTime" : "5 s","measurementBatchSize" : 1,"params" : {"length" : "10"},"primaryMetric" : {"score" : 2.4948150613578957E-6,"scoreError" : 1.1238982246115864E-6,"scoreConfidence" : [1.3709168367463092E-6,3.618713285969482E-6],"scorePercentiles" : {"0.0" : 1.4561640572531666E-6,"50.0" : 2.1912588467079646E-6,"90.0" : 4.420901428147037E-6,"95.0" : 4.841074442897258E-6,"99.0" : 4.841074442897258E-6,"99.9" : 4.841074442897258E-6,"99.99" : 4.841074442897258E-6,"99.999" : 4.841074442897258E-6,"99.9999" : 4.841074442897258E-6,"100.0" : 4.841074442897258E-6},"scoreUnit" : "ops/ns","rawData" : [[4.1138049369997915E-6,2.4765216035616155E-6,2.1912588467079646E-6,1.789423605929749E-6,1.4561640572531666E-6],[4.140786084980223E-6,2.5591632462186068E-6,2.2445508618694107E-6,1.7726205421615725E-6,1.5585637200319034E-6],[4.841074442897258E-6,2.800833094186311E-6,1.9730874497911443E-6,1.8848866640894546E-6,1.6194867636902629E-6]]},"secondaryMetrics" : {}},{"jmhVersion" : "1.23","benchmark" : "cn.ideamake.im.auth.service.Test.arrayListAdd","mode" : "thrpt","threads" : 5,"forks" : 3,"jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home/jre/bin/java","jvmArgs" : ["-javaagent:/Users/jeyyu/Applications/IntelliJ IDEA Ultimate.app/Contents/lib/idea_rt.jar=61534:/Users/jeyyu/Applications/IntelliJ IDEA Ultimate.app/Contents/bin","-Dfile.encoding=UTF-8"],"jdkVersion" : "1.8.0_261","vmName" : "Java HotSpot(TM) 64-Bit Server VM","vmVersion" : "25.261-b12","warmupIterations" : 3,"warmupTime" : "1 s","warmupBatchSize" : 100,"measurementIterations" : 5,"measurementTime" : "5 s","measurementBatchSize" : 1,"params" : {"length" : "20"},"primaryMetric" : {"score" : 1.2859270068428564E-6,"scoreError" : 6.255401258543347E-7,"scoreConfidence" : [6.603868809885217E-7,1.911467132697191E-6],"scorePercentiles" : {"0.0" : 7.927250243370195E-7,"50.0" : 1.0489617370260857E-6,"90.0" : 2.4044188117910495E-6,"95.0" : 2.506172746185885E-6,"99.0" : 2.506172746185885E-6,"99.9" : 2.506172746185885E-6,"99.99" : 2.506172746185885E-6,"99.999" : 2.506172746185885E-6,"99.9999" : 2.506172746185885E-6,"100.0" : 2.506172746185885E-6},"scoreUnit" : "ops/ns","rawData" : [[2.506172746185885E-6,1.3749914022210378E-6,1.042460182653776E-6,8.085105009167249E-7,7.98261178607378E-7],[2.150161901013991E-6,1.362837559664351E-6,1.0489617370260857E-6,8.930920686728167E-7,7.940245030098016E-7],[2.336582855527826E-6,1.4214980159279697E-6,1.0585275386698327E-6,9.000978882083538E-7,7.927250243370195E-7]]},"secondaryMetrics" : {}},{"jmhVersion" : "1.23","benchmark" : "cn.ideamake.im.auth.service.Test.arrayListAdd","mode" : "thrpt","threads" : 5,"forks" : 3,"jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home/jre/bin/java","jvmArgs" : ["-javaagent:/Users/jeyyu/Applications/IntelliJ IDEA Ultimate.app/Contents/lib/idea_rt.jar=61534:/Users/jeyyu/Applications/IntelliJ IDEA Ultimate.app/Contents/bin","-Dfile.encoding=UTF-8"],"jdkVersion" : "1.8.0_261","vmName" : "Java HotSpot(TM) 64-Bit Server VM","vmVersion" : "25.261-b12","warmupIterations" : 3,"warmupTime" : "1 s","warmupBatchSize" : 100,"measurementIterations" : 5,"measurementTime" : "5 s","measurementBatchSize" : 1,"params" : {"length" : "30"},"primaryMetric" : {"score" : 8.471727655992797E-7,"scoreError" : 3.7052359443423565E-7,"scoreConfidence" : [4.766491711650441E-7,1.2176963600335153E-6],"scorePercentiles" : {"0.0" : 5.302584706779764E-7,"50.0" : 6.834675315679355E-7,"90.0" : 1.52180707672635E-6,"95.0" : 1.5528636107639667E-6,"99.0" : 1.5528636107639667E-6,"99.9" : 1.5528636107639667E-6,"99.99" : 1.5528636107639667E-6,"99.999" : 1.5528636107639667E-6,"99.9999" : 1.5528636107639667E-6,"100.0" : 1.5528636107639667E-6},"scoreUnit" : "ops/ns","rawData" : [[1.5528636107639667E-6,9.596786727520295E-7,7.375483032591416E-7,6.000565980573166E-7,5.302584706779764E-7],[1.3089866553403504E-6,8.848246687708236E-7,6.728363935992605E-7,6.39243117656085E-7,5.589492168761859E-7],[1.5011027207012722E-6,9.477396838941437E-7,6.834675315679355E-7,5.996515606679904E-7,5.303842794047184E-7]]},"secondaryMetrics" : {}},{"jmhVersion" : "1.23","benchmark" : "cn.ideamake.im.auth.service.Test.linkedListAdd","mode" : "thrpt","threads" : 5,"forks" : 3,"jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home/jre/bin/java","jvmArgs" : ["-javaagent:/Users/jeyyu/Applications/IntelliJ IDEA Ultimate.app/Contents/lib/idea_rt.jar=61534:/Users/jeyyu/Applications/IntelliJ IDEA Ultimate.app/Contents/bin","-Dfile.encoding=UTF-8"],"jdkVersion" : "1.8.0_261","vmName" : "Java HotSpot(TM) 64-Bit Server VM","vmVersion" : "25.261-b12","warmupIterations" : 3,"warmupTime" : "1 s","warmupBatchSize" : 100,"measurementIterations" : 5,"measurementTime" : "5 s","measurementBatchSize" : 1,"params" : {"length" : "10"},"primaryMetric" : {"score" : 3.1518365953260005E-4,"scoreError" : 2.650344132453461E-4,"scoreConfidence" : [5.0149246287253975E-5,5.802180727779462E-4],"scorePercentiles" : {"0.0" : 2.040936832220465E-9,"50.0" : 3.258020124110451E-4,"90.0" : 6.290582852453083E-4,"95.0" : 6.511044004158607E-4,"99.0" : 6.511044004158607E-4,"99.9" : 6.511044004158607E-4,"99.99" : 6.511044004158607E-4,"99.999" : 6.511044004158607E-4,"99.9999" : 6.511044004158607E-4,"100.0" : 6.511044004158607E-4},"scoreUnit" : "ops/ns","rawData" : [[5.799090206566678E-4,2.8203434053498754E-4,4.084852992147824E-4,5.5462968000398634E-5,2.040936832220465E-9],[5.959891124894796E-4,2.741420658031856E-4,4.050103147846094E-4,1.292647379800531E-4,2.1377832450477853E-9],[6.511044004158607E-4,3.258020124110451E-4,3.9017912291265433E-4]]},"secondaryMetrics" : {}},{"jmhVersion" : "1.23","benchmark" : "cn.ideamake.im.auth.service.Test.linkedListAdd","mode" : "thrpt","threads" : 5,"forks" : 3,"jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home/jre/bin/java","jvmArgs" : ["-javaagent:/Users/jeyyu/Applications/IntelliJ IDEA Ultimate.app/Contents/lib/idea_rt.jar=61534:/Users/jeyyu/Applications/IntelliJ IDEA Ultimate.app/Contents/bin","-Dfile.encoding=UTF-8"],"jdkVersion" : "1.8.0_261","vmName" : "Java HotSpot(TM) 64-Bit Server VM","vmVersion" : "25.261-b12","warmupIterations" : 3,"warmupTime" : "1 s","warmupBatchSize" : 100,"measurementIterations" : 5,"measurementTime" : "5 s","measurementBatchSize" : 1,"params" : {"length" : "20"},"primaryMetric" : {"score" : 1.266940848706251E-4,"scoreError" : 1.067901481727194E-4,"scoreConfidence" : [1.9903936697905698E-5,2.334842330433445E-4],"scorePercentiles" : {"0.0" : 1.0570643716444602E-9,"50.0" : 1.277025840062132E-4,"90.0" : 2.873144880878097E-4,"95.0" : 3.0071795274955784E-4,"99.0" : 3.0071795274955784E-4,"99.9" : 3.0071795274955784E-4,"99.99" : 3.0071795274955784E-4,"99.999" : 3.0071795274955784E-4,"99.9999" : 3.0071795274955784E-4,"100.0" : 3.0071795274955784E-4},"scoreUnit" : "ops/ns","rawData" : [[2.7837884497997756E-4,1.4004379809432887E-4,1.690648751904472E-4,3.979439739105633E-5,1.0570643716444602E-9],[2.539248775424261E-4,1.2300171183989418E-4,1.6619190221717098E-4,9.198943682584735E-5,3.341751395204592E-7],[3.0071795274955784E-4,1.277025840062132E-4,1.712266253033709E-4,3.8037901883119315E-5,1.1328320741323733E-9]]},"secondaryMetrics" : {}},{"jmhVersion" : "1.23","benchmark" : "cn.ideamake.im.auth.service.Test.linkedListAdd","mode" : "thrpt","threads" : 5,"forks" : 3,"jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_261.jdk/Contents/Home/jre/bin/java","jvmArgs" : ["-javaagent:/Users/jeyyu/Applications/IntelliJ IDEA Ultimate.app/Contents/lib/idea_rt.jar=61534:/Users/jeyyu/Applications/IntelliJ IDEA Ultimate.app/Contents/bin","-Dfile.encoding=UTF-8"],"jdkVersion" : "1.8.0_261","vmName" : "Java HotSpot(TM) 64-Bit Server VM","vmVersion" : "25.261-b12","warmupIterations" : 3,"warmupTime" : "1 s","warmupBatchSize" : 100,"measurementIterations" : 5,"measurementTime" : "5 s","measurementBatchSize" : 1,"params" : {"length" : "30"},"primaryMetric" : {"score" : 1.0018490369816409E-4,"scoreError" : 7.4688462191315E-5,"scoreConfidence" : [2.549644150684908E-5,1.748733658894791E-4],"scorePercentiles" : {"0.0" : 2.423143548980252E-8,"50.0" : 9.23894279692493E-5,"90.0" : 2.1170862702798537E-4,"95.0" : 2.220596797238462E-4,"99.0" : 2.220596797238462E-4,"99.9" : 2.220596797238462E-4,"99.99" : 2.220596797238462E-4,"99.999" : 2.220596797238462E-4,"99.9999" : 2.220596797238462E-4,"100.0" : 2.220596797238462E-4},"scoreUnit" : "ops/ns","rawData" : [[2.0480792523074482E-4,8.962885218669426E-5,1.1985924046108952E-4,6.011791224746196E-5,3.439292032454452E-8],[1.8999885350868268E-4,8.464552988300562E-5,1.1405865213041896E-4,7.856668953262646E-5,2.423143548980252E-8],[2.220596797238462E-4,1.1198263143710367E-4,1.345185179434591E-4,9.23894279692493E-5,8.101886226446768E-8]]},"secondaryMetrics" : {}}
]

本文到此结束,希望对你有帮助~

相关文章:

java JMH 学习

JMH 是什么&#xff1f; JMH&#xff08;Java Microbenchmark Harness&#xff09;是一款专用于代码微基准测试的工具集&#xff0c;其主要聚焦于方法层面的基准测试&#xff0c;精度可达纳秒级别。此工具由 Oracle 内部负责实现 JIT 的杰出人士编写&#xff0c;他们对 JIT 及…...

本地运行AI大模型简单示例

一、引言 大模型LLM英文全称是Large Language Model&#xff0c;是指包含超大规模参数&#xff08;通常在十亿个以上&#xff09;的神经网络模型。2022年11月底&#xff0c;人工智能对话聊天机器人ChatGPT一经推出&#xff0c;人们利用ChatGPT这样的大模型帮助解决很多事情&am…...

图像处理:时域、空域、频率的滤波介绍

首先要搞清楚为什么会呈现出不同域的维度&#xff0c;来理解和处理图像&#xff0c;原因是图像的构成有多个维度的信息特点。比如一段视频从时间顺序来看&#xff0c;相邻的2个图像帧绝大部分信息是相同的&#xff0c;这就构成了前向预测的理论基础&#xff1b;比如一帧图像从空…...

TC8002D 是一颗带关断模式的音频功放IC

一、一般概述 TC8002D是一颗带关断模式的音频功放IC。在5V输入电压下工作时&#xff0c;负载(3Ω)上的平均功率 为3 W&#xff0c;且失真度不超过10%。而对于手提设备而言&#xff0c;当VDD作用于关断端时&#xff0c;TC8002D将会进入关断模式&#xff0c;此时的功耗极…...

深度学习之基于Vgg19预训练卷积神经网络图像风格迁移系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 在数字艺术和图像处理领域&#xff0c;图像风格迁移技术一直备受关注。该技术可以将一幅图像的内容和…...

MySQL:多表查询练习

#1.出版社信息 与 图书信息 交叉连接 select * from 出版社信息 cross join 图书信息; #2.从“客户信息”和“订单信息”两张数据表中查询购买了商品的客户信息&#xff0c;要求查询结果显示客户姓名、订单编号、订单状态。 select 客户信息.客户姓名,订单信息.订单编号,订单…...

# 从浅入深 学习 SpringCloud 微服务架构(八)Sentinel(1)

从浅入深 学习 SpringCloud 微服务架构&#xff08;八&#xff09;Sentinel&#xff08;1&#xff09; 一、sentinel&#xff1a;概述 1、前言 – 服务熔断 Hystrix 的替换方案。 1&#xff09;2018年底 Netflix 官方宣布 Hystrix 已经足够稳定&#xff0c;不再积极开发 Hys…...

[微信小程序] 入门笔记2-自定义一个显示组件

[微信小程序] 入门笔记2-自定义一个显示组件 0. 准备工程 新建一个工程,删除清空app的内容和其余文件夹.然后自己新建pages和components创建1个空组件和1个空页面. 设定 view 组件的默认样式,使其自动居中靠上,符合习惯.在app.wxss内定义,作用做个工程. /**app.wxss**/ /* 所…...

YOLO代码复现

睿智的目标检测66——Pytorch搭建YoloV8目标检测平台_pytorch_quantization yolov8-CSDN博客 Mask rcnn代码实现_pytorch版_适用30系列显卡_mask rcnn 30显卡-CSDN博客 完整且详细的Yolov8复现训练自己的数据集-CSDN博客...

使用fitten code插件(vscode),替换通义千问,识别需求中的输入输出

今天我们介绍一个工具,具体介绍可以参考我的这篇文章的介绍,支持vs code 插件,Fitten Code是一款由非十科技开发的AI代码助手,旨在通过大模型驱动来提升编程效率和体验-免费神器-CSDN博客https://blog.csdn.net/lijigang100/article/details/137833223?spm=1001.2014.3001…...

vue使用pdfjs-dist在电脑上展示PDF文件

安装 安装的时候一定要带上版本号,这里采用的是2.0.943(因为这个版本对于我目前的项目比较合适可以正常使用,其他版本大概率会报错),当前项目使用的是vue2,vue的版本是2.5.10 npm install pdfjs-dist@2.0.943 查看版本发现这玩意版本非常之多 使用 在使用pdfjs-dist库…...

【网站项目】戒烟网站

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…...

慢性软组织疼痛如何使用DMS深层肌肉刺激仪进行治疗?

使用DMS深层肌肉刺激仪治疗慢性软组织疼痛&#xff0c;可以遵循以下步骤&#xff1a; 准备工作&#xff1a;首先&#xff0c;确保DMS设备已经充电或插上电源&#xff0c;并根据需要调整振动强度和频率。DMS深层肌肉刺激仪是通过快速连续的振动和打击来刺激深层肌肉的设备&#…...

自动化测试常用工具

自动化测试工具是非常重要的。自动化测试工具可以帮助程序员提高工作效率&#xff0c;减少重复劳动和人为错误&#xff0c;提高产品质量。下面我将介绍几个常用的自动化测试工具。 Selenium&#xff1a;Selenium是一个开源的自动化测试框架&#xff0c;用于Web应用程序的自动化…...

【Osek网络管理测试】[TG4_TC4]tWaitBusSleep

🙋‍♂️ 【Osek网络管理测试】系列💁‍♂️点击跳转 文章目录 1.环境搭建2.测试目的3.测试步骤4.预期结果5.测试结果1.环境搭建 硬件:VN1630 软件:CANoe 2.测试目的 验证DUT的tWBS时间参数是否符合NM标准 本处规定tWBS在[1350ms,1650ms]范围内符合要求 3.测试步骤…...

java08基础(值传递和引用传递 类和对象)

目录 一. 值传递和引用传递 1. 值传递 2. 引用传递 二. 面向对象思想 三. 类和对象 1. 类 2. 对象 2.1 使用 2.2 成员变量和局部变量区别 2.3 操作成员方法 2.4 this关键字(初识) 2.5 构造方法 (见java09) 一. 值传递和引用传递 1. 值传递 值传递是指在调用函数时将…...

高级数据结构与算法习题(9)

一、判断题 1、Let S be the set of activities in Activity Selection Problem. Then the earliest finish activity am​ must be included in all the maximum-size subset of mutually compatible activities of S. T F 解析:F。设S是活动选择问题中的一…...

Linux的vim下制作进度条

目录 前言&#xff1a; 回车和换行有区别吗&#xff1f; 回车和换行的区别展示&#xff08;这个我在Linux下演示&#xff09; 为什么会消失呢? 回车和换行的区别 为什么\r和\n产生的效果不同&#xff1f; 打印进度条&#xff1a; &#xff08;1&#xff09;打印字符串 …...

C++学习笔记2

T1 奇怪的教室 题目背景 LSU 的老师有个奇怪的教室&#xff0c;同学们会从左到右坐成一个横排&#xff0c;并且同一个位置可以坐多个同学。这天&#xff0c;入学考试的成绩下来了。同学们想根据入学考试的成绩&#xff0c;找出班里学霸扎堆的区域“学霸区”。 题目描述 共有…...

细数:智能物流装备界的并购案~

导语 大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;老K。专注分享智能仓储物流技术、智能制造等内容。 新书《智能物流系统构成与技术实践》 近年来&#xff0c;随着智能仓储物流行业的快速发展&#xff0c;全球范围内的并购活动日益频繁&#xff0c;各大企…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...