当前位置: 首页 > 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;各大企…...

微信小程序播放编码为 video/mp4;codecs=vp8 opus 的视频没有声音

最近在做浏览器录屏功能&#xff0c;主要是录屏加上麦克风生成mp4视频&#xff0c;最终生成的是编码为 video/mp4;codecsvp8 opus 的视频&#xff0c;音频编码因为是 opus 是无法在小程序正常播放的&#xff0c;这样就导致了视频没有声音。后来就在服务端做了一层转换&#xff…...

Linux 指令lsblk 作用,以及查看cpu使用情况和磁盘IO iostat指令详解

lsblk 指令 在Linux系统中&#xff0c;lsblk&#xff08;列表块设备&#xff09;命令是一个非常实用的工具&#xff0c;用于显示所有可用的块设备信息&#xff0c;如硬盘、USB驱动器、SD卡以及它们的分区。这个命令以易于理解的树状结构展示这些信息&#xff0c;清晰地表明了设…...

Mybatis之Sqlsession、Connection和Transaction三者间的关系

前言 最近在看Mybatis的源码&#xff0c;搜到这篇文章Sqlsession、Connection和Transaction原理与三者间的关系&#xff0c;debug之后发现有不少疑惑&#xff0c;于是按照原文整理了一下&#xff0c;记录下debug中的一些困惑点。 对于我们开发来讲&#xff0c;不管跟任何关系…...

WRT1900ACS搭建openwrt服务器小记

参考链接 wrt1900acs openwrt wrt1900acs openwrt 刷机 wrt1900acs原生固件刷openwrt-23.05.3-mvebu-cortexa9-linksys_wrt1900acs-squashfs-factory.img wrt1900acs openwrt更新刷openwrt-23.05.3-mvebu-cortexa9-linksys_wrt1900acs-squashfs-sysupgrade.bin 通过WEB UI来…...

Spring AOP(3)

目录 Spring AOP原理 代理模式 代理模式中的主要角色 静态代理 动态代理 总结:面试题 什么是AOP? Spring AOP实现的方式有哪些? Spring AOP实现原理 Spring使用的是哪种代理方式? JDK和CGLIB动态代理的区别? Spring AOP原理 代理模式 代理模式, 也叫委托模式. …...

推荐5个免费的国内平替版GPT

提起AI&#xff0c;大家第一个想到的就是GPT。 虽然它确实很厉害&#xff0c;但奈何于我们水土不服&#xff0c;使用门槛有些高。 不过随着GPT的爆火&#xff0c;现在AI智能工具已经遍布到各行各业了&#xff0c;随着时间的推移&#xff0c;国内的AI工具也已经“百花盛放”了…...

弹性云服务器是什么,为何如此受欢迎

云计算作为当下炙手可热的技术领域&#xff0c;已然成为现代企业不可或缺的核心能力。云服务器作为云计算的基石之一&#xff0c;在这个数字化时代发挥着至关重要的作用。而弹性云服务器&#xff0c;作为云服务器的一种演进形式&#xff0c;更是备受瞩目。 弹性云服务器&#…...

Docker部署RabbitMQ与简单使用

官网地址&#xff1a; Messaging that just works — RabbitMQ 我的Docker博客:Docker-CSDN博客 1.结构 其中包含几个概念&#xff1a; **publisher**&#xff1a;生产者&#xff0c;也就是发送消息的一方 **consumer**&#xff1a;消费者&#xff0c;也就是消费消息的一方 …...

2024年黄石市建设优质工程评价认定申报条件、流程及材料合集

2024年黄石市建设优质工程评价认定申报条件、流程及材料合集如下&#xff0c;黄石市的企业单位可以了解一下&#xff0c;有疑问名字找我哦。 第一章总则 第一条为贯彻落实《中华人民共和国建筑法》、《安全生产法》、《建设工程质量管理条例》、《建设工程安全生产管理条例》…...

偏微分方程算法之混合边界条件下的差分法

目录 一、研究目标 二、理论推导 三、算例实现 四、结论 一、研究目标 我们在前几节中介绍了Poisson方程的边值问题&#xff0c;接下来对椭圆型偏微分方程的混合边值问题进行探讨&#xff0c;研究对象为&#xff1a; 其中&#xff0c;为矩形区域&#xff0c;为上的连续函数…...

apollo资料整理

Application X: Application X Apollo: Apollo 自动驾驶开放平台 Cyber RT API tutorial — Cyber RT Documents documentation Cyber RT API tutorial — Cyber RT Documents documentation GitHub - daohu527/dig-into-apollo: Apollo notes (Apollo学习笔记) - Apollo l…...

森林消防新利器:高扬程水泵的革新与应用/恒峰智慧科技

随着全球气候变化的加剧&#xff0c;森林火灾的频发已成为威胁生态安全的重要问题。在森林消防工作中&#xff0c;高效、快速的水源供给设备显得尤为重要。近年来&#xff0c;高扬程水泵的广泛应用&#xff0c;为森林消防工作带来了新的希望与突破。 一、高扬程水泵的技术优势 …...

Microsoft Universal Print 与 SAP 集成教程

引言 从 SAP 环境打印是许多客户的要求。例如数据列表打印、批量打印或标签打印。此类生产和批量打印方案通常使用专用硬件、驱动程序和打印解决方案来解决。 Microsoft Universal Print 是一种基于云的打印解决方案&#xff0c;它允许组织以集中化的方式管理打印机和打印机驱…...

VBA在Excel中字母、数字的相互转化

VBA在Excel中字母、数字的相互转化 字母转数字的方法 数字转字母的方法 众所周知,Excel表中的行以数字展示,列用字母展示,如下图: 编程时,很多时候需要将列的字母转变为数字使用,如cells(num1,num2).value等,不知大家是怎么将字母转化为数字的,Excel是否有其他方式…...

【C语言】——联合体与枚举

【C语言】——联合体与枚举 一、联合体1.1、联合体类型的声明1.2、联合体的特点1.3、相同成员的结构体和联合体对比1.4、联合体的大小计算1.5、联合体的应用举例 二、枚举2.1、枚举类型的声明2.2、枚举类型的优点 一、联合体 1.1、联合体类型的声明 联合体也叫做共用体   与…...

java线上问题排查之内存分析(三)

java线上问题排查之内存分析 使用top命令 top命令显示的结果列表中&#xff0c;会看到%MEM这一列&#xff0c;这里可以看到你的进程可能对内存的使用率特别高。以查看正在运行的进程和系统负载信息&#xff0c;包括cpu负载、内存使用、各个进程所占系统资源等。 2.用jstat命令…...

中电金信:金Gien乐道 | 4月要闻速览,精彩再回顾

中国电子党组副书记、总经理李立功一行调研中电金信 4月10日&#xff0c;中国电子党组副书记、总经理李立功一行赴中电金信进行调研&#xff0c;深入听取了中电金信经营发展情况、研发工作及“源启”行业数字底座平台的汇报&#xff0c;并参观了公司展厅和科技研发场所&#xf…...

Java将文件目录转成树结构

在实际开发中经常会遇到返回树形结构的场景&#xff0c;特别是在处理文件系统或者是文件管理系统中。下面就介绍一下怎么将文件路径转成需要的树形结构。 在Java中&#xff0c;将List<String>转换成树状结构&#xff0c;需要定义一个树节点类&#xff08;TreeNode&#…...

硬件工程师必读:10条职业发展黄金法则!

在快速发展的科技时代&#xff0c;硬件工程师作为推动技术创新和产业升级的重要力量&#xff0c;其职业发展之路既充满挑战也蕴含无限机遇。为了在这条道路上稳步前行&#xff0c;我们首先需要了解硬件产品的研发流程。 在这个过程中&#xff0c;公司内的每个岗位都发挥着不可或…...

Redis是什么? 日常运维 Redis 需要注意什么 ? 怎么降低Redis 内存使用 节省内存?

你的项目或许已经使用 Redis 很长时间了&#xff0c;但在使用过程中&#xff0c;你可能还会或多或少地遇到以下问题&#xff1a; 我的 Redis 内存为什么增长这么快&#xff1f;为什么我的 Redis 操作延迟变大了&#xff1f;如何降低 Redis 故障发生的频率&#xff1f;日常运维…...

【Android项目】“追茶到底”项目介绍

没有多的介绍&#xff0c;这里只是展示我的项目效果&#xff0c;后面会给出具体的代码实现。 一、用户模块 1、注册&#xff08;第一次登陆的话需要先注册账号&#xff09; 2、登陆&#xff08;具有记住最近登录用户功能&#xff09; 二、点单模块 1、展示饮品列表 2、双向联动…...

机试:进制转换问题

十进制转任意进制 简单回忆一下十进制我们是怎么转换成二进制的&#xff08;短除法&#xff09;&#xff1a; 我们会将十进制数不断的进行除2操作&#xff0c;并且记录下每一次的余数&#xff08;这个余数就是我们最终求的二进制数的组成部分&#xff09;。 以下以12D举例&a…...

目标检测实战(十五): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)

文章目录 一、目标检测介绍二、YOLOv7介绍三、源码/论文获取四、环境搭建4.1 环境检测 五、数据集准备六、 模型训练七、模型验证八、模型测试九、错误总结9.1 错误1-numpy jas mp attribute int9.2 错误2-测试代码未能跑出检测框9.3 错误3- Command git tag returned non-zero…...

github中fasttext库README官文文档翻译

参考链接&#xff1a;fastText/python/README.md at main facebookresearch/fastText (github.com) fastText模块介绍 fastText 是一个用于高效学习单词表述和句子分类的库。在本文档中&#xff0c;我们将介绍如何在 python 中使用 fastText。 环境要求 fastText 可在现代 …...

WouoUIPagePC端实现

WouoUIPagePC端实现 WouoUIPage是一个与硬件平台无关&#xff0c;纯C语言的UI库&#xff08;目前只能应用于128*64的单色OLED屏幕上&#xff0c;后期会改进&#xff0c;支持更多尺寸&#xff09;。因此&#xff0c;我们可以在PC上实现它&#xff0c;本文就以在PC上使用 VScode…...

W801学习笔记十九:古诗学习应用——下

经过前两章的内容&#xff0c;背唐诗的功能基本可以使用了。然而&#xff0c;仅有一种模式未免显得过于单一。因此&#xff0c;在本章中对其进行扩展&#xff0c;增加几种不同的玩法&#xff0c;并且这几种玩法将采用完全不同的判断方式。 玩法一&#xff1a;三分钟限时挑战—…...

类加载器ClassLoad-jdk1.8

类加载器ClassLoad-jdk1.8 1. 类加载器的作用2. 类加载器的种类&#xff08;JDK8&#xff09;3. jvm内置类加载器如何搜索加载类--双亲委派模型4. 如何打破双亲委派模型--自定义类加载器5. 自定义一个类加载器5.1 为什么需要自定义类加载器5.2 自定义一个类加载器 6. java代码加…...

24年最新AI数字人简单混剪

24年最新AI数字人简单混剪 网盘自动获取 链接&#xff1a;https://pan.baidu.com/s/1lpzKPim76qettahxvxtjaQ?pwd0b8x 提取码&#xff1a;0b8x...

免备案香港主机会影响网站收录?

免备案香港主机会影响网站收录?前几天遇到一个做电子商务的朋友说到这个使用免备案香港主机的完整会不会影响网站的收录问题&#xff0c;这个问题也是站长关注较多的问题之一。小编查阅了百度官方规则说明&#xff0c;应该属于比较全面的。下面小编给大家介绍一下使用免备案香…...

低代码工业组态数字孪生平台

2024 两会热词「新质生产力」凭借其主要特征——高科技、高效能及高质量&#xff0c;引发各界关注。在探索构建新质生产力的重要议题中&#xff0c;数据要素被视为土地、劳动力、资本和技术之后的第五大生产要素。数据要素赋能新质生产力发展主要体现为&#xff1a;生产力由生产…...