- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
官方Github样例 。
nextByCalendarAndRandom
, 序号生成是采用两位随机数,然后随机数产生了冲突,一毫秒内产生的两个随机数有冲突, nextByCalendarAndAtomicInteger
自增,就表示一毫秒最大只有100个请求能进来?超过就肯定会冲突? nextByLocalDateTimeAndAtomicInteger
方法,也有每毫秒超100必定重复的限制
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>1.35</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>1.35</version>
</dependency>
@UtilityClass
public class IdWork {
@Deprecated
public static String nextByCalendarAndRandom(String merchantNo) {
Calendar now = Calendar.getInstance();
long random1 = Math.round(Math.random() * 9);
long random2 = Math.round(Math.random() * 9);
String timestamp = (now.get(Calendar.YEAR) + "").substring(2)
+ (now.get(Calendar.MONTH) + 1)
+ now.get(Calendar.DAY_OF_MONTH)
+ now.get(Calendar.HOUR_OF_DAY)
+ now.get(Calendar.MINUTE)
+ now.get(Calendar.SECOND)
+ now.get(Calendar.MILLISECOND);
return merchantNo + timestamp + random1 + random2;
}
@Deprecated
public static String nextByLocalDateTimeAndRandom(String merchantNo) {
LocalDateTime now = LocalDateTime.now();
long random1 = Math.round(Math.random() * 9);
long random2 = Math.round(Math.random() * 9);
String timestamp = (now.getYear() + "").substring(2)
+ now.getMonthValue()
+ now.getDayOfMonth()
+ now.getHour()
+ now.getMinute()
+ now.getSecond()
+ (now.getNano() / 1000000);
return merchantNo + timestamp + random1 + random2;
}
@Deprecated
public static String nextByCalendarAndAtomicInteger(String merchantNo) {
Calendar now = Calendar.getInstance();
String timestamp = (now.get(Calendar.YEAR) + "").substring(2)
+ (now.get(Calendar.MONTH) + 1)
+ now.get(Calendar.DAY_OF_MONTH)
+ now.get(Calendar.HOUR_OF_DAY)
+ now.get(Calendar.MINUTE)
+ now.get(Calendar.SECOND)
+ now.get(Calendar.MILLISECOND);
return merchantNo + timestamp + getSeqNo();
}
@Deprecated
public static String nextByLocalDateTimeAndAtomicInteger(String merchantNo) {
LocalDateTime now = LocalDateTime.now();
String timestamp = (now.getYear() + "").substring(2)
+ now.getMonthValue()
+ now.getDayOfMonth()
+ now.getHour()
+ now.getMinute()
+ now.getSecond()
+ (now.getNano() / 1000000);
return merchantNo + timestamp + getSeqNo();
}
public static String nextBySnowflake(String merchantNo) {
return merchantNo + IdGenerator.next();
}
private static AtomicInteger seqNo = new AtomicInteger(1);
private static String getSeqNo() {
int curSeqNo = seqNo.getAndIncrement();
if (curSeqNo > 99) { // 重置,也可以取模
seqNo = new AtomicInteger(1);
}
if (curSeqNo < 10) {
return "0" + curSeqNo;
}
return curSeqNo + "";
}
public static void main(String[] args) {
String next1 = IdWork.nextByCalendarAndRandom("900087");
System.out.println(next1);
String next2 = IdWork.nextByLocalDateTimeAndRandom("900087");
System.out.println(next2);
String next3 = IdWork.nextByCalendarAndAtomicInteger("900087");
System.out.println(next3);
String next4 = IdWork.nextByLocalDateTimeAndAtomicInteger("900087");
System.out.println(next4);
String next5 = IdWork.nextBySnowflake("900087");
System.out.println(next5);
}
}
public class IdTest {
@Benchmark
public String getIdBySnowflake() {
return IdWork.nextBySnowflake("900087");
}
@Benchmark
public String nextByCalendarAndRandom() {
return IdWork.nextByCalendarAndRandom("900087");
}
@Benchmark
public String nextByLocalDateTimeAndRandom() {
return IdWork.nextByLocalDateTimeAndRandom("900087");
}
@Benchmark
public String nextByCalendarAndAtomicInteger() {
return IdWork.nextByCalendarAndAtomicInteger("900087");
}
@Benchmark
public String nextByLocalDateTimeAndAtomicInteger() {
return IdWork.nextByLocalDateTimeAndAtomicInteger("900087");
}
public static void main(String[] args) throws RunnerException {
// 吞吐量
// Options opt = new OptionsBuilder()
// .include(IdTest.class.getSimpleName())
// .mode(Mode.Throughput)
// .forks(1)
// .build();
// 平均耗时
Options opt = new OptionsBuilder()
.include(IdTest.class.getSimpleName())
.mode(Mode.AverageTime)
.timeUnit(TimeUnit.NANOSECONDS)
.forks(1)
.build();
new Runner(opt).run();
}
// 吞吐量
// Benchmark Mode Cnt Score Error Units
// IdTest.getIdBySnowflake thrpt 5 4070403.840 ± 11302.832 ops/s
// IdTest.nextByCalendarAndAtomicInteger thrpt 5 4201822.821 ± 177869.095 ops/s
// IdTest.nextByCalendarAndRandom thrpt 5 4085723.001 ± 47505.309 ops/s
// IdTest.nextByLocalDateTimeAndAtomicInteger thrpt 5 5036852.390 ± 153313.836 ops/s
// IdTest.nextByLocalDateTimeAndRandom thrpt 5 5199148.189 ± 405132.888 ops/s
// 平均耗时
// Benchmark Mode Cnt Score Error Units
// IdTest.getIdBySnowflake avgt 5 245.739 ± 0.302 ns/op
// IdTest.nextByCalendarAndAtomicInteger avgt 5 239.174 ± 4.244 ns/op
// IdTest.nextByCalendarAndRandom avgt 5 251.084 ± 5.798 ns/op
// IdTest.nextByLocalDateTimeAndAtomicInteger avgt 5 197.332 ± 0.779 ns/op
// IdTest.nextByLocalDateTimeAndRandom avgt 5 212.105 ± 1.888 ns/op
}
类型 | 作用域 | 描述 | 备注 |
---|---|---|---|
Benchmark | ElementType.METHOD | 最重要的注解,标记需要执行的方法 | |
BenchmarkMode | ElementType.METHOD, ElementType.TYPE | 统计的维度,有吞吐量,平均耗时,也可以组合使用 | |
Fork | ElementType.METHOD, ElementType.TYPE | 复制多个进程来执行方法,每轮默认Iteration循环5次,如果fork 3,则会执行3*5 次,一般默认值1就可以 | |
Measurement | ElementType.METHOD, ElementType.TYPE | 方法控制:循环次数,每次循环时间以及对应的时间单位 | |
Warmup | ElementType.METHOD,ElementType.TYPE | 预热,避免系统冷启动导致的性能测试不准 | |
OutputTimeUnit | ElementType.METHOD, ElementType.TYPE | 输出时间单位,默认是秒 | |
Param | ElementType.FIELD | 可以指定遍历参数,针对特殊字段测试不同的性能 | |
Setup | ElementType.METHOD | 启动类设置,类似 junit Before类型注解 | |
TearDown | ElementType.METHOD | 销毁类设置,类似junit After类型注解,一般用于销毁池化的资源 | |
Threads | ElementType.METHOD,ElementType.TYPE | ||
Timeout | ElementType.METHOD,ElementType.TYPE | ||
AuxCounters | ElementType.TYPE | 辅助计数器,可以统计 @State 修饰的对象中的 public 属性被执行的情况 | |
Group | ElementType.METHOD | ||
GroupThreads | ElementType.METHOD | ||
CompilerControl | ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.TYPE | 内联扩展是一种特别的用于消除调用函数时所造成的固有时间消耗方法,这里用来控制方法或类是否内联 | |
OperationsPerInvocation | ElementType.METHOD, ElementType.TYPE |
BenchmarkMode 执行模式(可以多个组合执行) 。
类型 | 描述 |
---|---|
Throughput | 每段时间执行的次数,一般是秒 |
AverageTime | 平均时间,每次操作的平均耗时 |
SampleTime | 在测试中,随机进行采样执行的时间 |
SingleShotTime | 在每次执行中计算耗时 |
All | 所有模式 |
// 常用的注解
@BenchmarkMode({Mode.Throughput,Mode.AverageTime})
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 3, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Fork(1)
public class BenchmarkTest {
@Benchmark
public long test() {}
}
// 使用 OptionsBuilder 建造者模式构建 Options, 然后在main方法执行,建议使用
Options opt = new OptionsBuilder()
.include(IdTest.class.getSimpleName())
.mode(Mode.AverageTime)
.mode(Mode.Throughput)
.timeUnit(TimeUnit.NANOSECONDS)
.warmupIterations(3)
.warmupTime(TimeValue.seconds(1))
.measurementIterations(5)
.measurementTime(TimeValue.seconds(1))
.forks(1)
.build();
避免循环 。
JVM会对循环进行优化,这样会导致获取的测试结果不准确.
jmh-java-microbenchmark-harness jenkov: java-performance jmh-benchmark-with-examples Java基准测试工具 —— JMH使用指南 。
最后此篇关于JMH–Java基准测试的文章就讲到这里了,如果你想了解更多关于JMH–Java基准测试的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在阅读一些基准测试技巧,并在此站点上发现了一条提示“重新启动 MySQL 服务器以消除任何不需要的缓存因素”:http://blog.monitor.us/2012/09/the-gold-sta
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
我在linux上测量cpu时间和排序算法的时间。我使用getrusage来测量cpu时间,并使用clock_gettime CLOCK_MONOTONIC来获取墙时间。尽管我注意到cpu时间大于墙上时
我可以阅读很多关于 OpenCL 的文章,它似乎是最有前途的(唯一的?)多架构库。 OpenCL应该是第一个并行架构编程标准,它最终会被大部分程序员采用。这很好,但是从 native 编程库迁移到 O
我想在不使用外部依赖项的情况下对一些 Lua 进行基准测试。我目前正在使用 os.clock: local function dummy() end local start = os.clock()
我对此很好奇。 我想检查哪个函数更快,所以我编写了一些代码并执行了很多次。 public static void main(String[] args) { long ts;
有没有办法在项目的开发阶段对 SQL 查询进行基准测试? 有问题的表中只有几个示例行,但我想在行数达到数千、数百万、数十亿、数万亿、数亿等等之前对一些查询进行基准测试 用数千行样本数据填充表格是唯一的
我正在尝试测量使用 rdtsc 执行函数“check()”所需的时间,如下所示: a = rdtsc(); check(pw); b = rdtsc(); return (b-a); 但是,我收到的时
我想在我的 Hadoop 集群上执行基准测试和性能测试。我知道 hadoop-mapreduce*test*.jar 和 hadoop-mapreduce-examples*.jar 有很多用于基准测
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
这个现在非常常见的算法问题是在白板考试期间由监考人员提出的。我的工作是观察、倾听和客观判断给出的答案,但我无法控制这个问题,也无法与回答者互动。 给了五分钟的时间分析问题,考生可以写项目符号,伪代码(
我把代码从 http://www.bonto.ch/blog/2011/12/08/json-libraries-for-ios-comparison-updated/并在我的本地机器上进行了测试。
我正在尝试使用 MySQL 基准测试来测试一些查询。但是,我遇到了一个错误。 SELECT benchmark (10000, (select title from user)); 作为返回,我得到了
我很好奇这个。 我想检查哪个函数更快,所以我创建了一些代码并执行了很多次。 public static void main(String[] args) { long ts;
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 9 年前。 Improve this qu
我经常想比较同一函数的多个实现的运行时性能。对于个人输入,标准是一个很好的工具。 但是有什么简单的方法可以在不同的输入大小上绘制代码的性能,例如看算法复杂度? 理想情况下,我向库传递一个类型为 Ben
我有一系列旨在完成相同功能的功能。相同的输入产生相同的输出,但是执行这些输出所需的时间因功能而异。我想确定哪个是“最快”的,我想对自己的测量结果具有“统计学意义”有一定的信心。 细读Wikipedia
我想编写一个加载基准测试,它以编译时已知的步幅跨过给定的内存区域,并在该区域的末尾(2 的幂)使用尽可能少的非加载指令进行包装有可能。 例如,给定步长 4099,rdi 中的迭代计数以及 rsi 中指
我有多个组件与 RabbitMQ 相连。有些是生产者和消费者。我需要对我的系统进行基准测试/负载测试。我需要确保消费者每秒可以处理 N 条消息。我在互联网上做了一些搜索,但还没有真正找到任何东西。有没
是否有任何基准或研究来比较这两个 IDE --稳定性-- 开发人员生产力 - 特征 - 表现-- 等等 最佳答案 我是 Eclipse 用户(不是自愿的)。不确定稳定性,但性能方面 NetBeans
我是一名优秀的程序员,十分优秀!