最近我遇到了一个关于字符串连接的问题。该基准对其进行了总结:
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class BrokenConcatenationBenchmark {
@Benchmark
public String slow(Data data) {
final Class<? extends Data> clazz = data.clazz;
return "class " + clazz.getName();
}
@Benchmark
public String fast(Data data) {
final Class<? extends Data> clazz = data.clazz;
final String clazzName = clazz.getName();
return "class " + clazzName;
}
@State(Scope.Thread)
public static class Data {
final Class<? extends Data> clazz = getClass();
@Setup
public void setup() {
//explicitly load name via native method Class.getName0()
clazz.getName();
}
}
}
Run Code Online (Sandbox Code Playgroud)
在 JDK …
java string performance string-concatenation compiler-optimization
我尝试了两种方法在 java.lang.String 上逐个字符地迭代,发现它们令人困惑。该基准对其进行了总结:
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Fork(jvmArgsAppend = {"-Xms2g", "-Xmx2g"})
public class CharByCharIterationBenchmark {
@Benchmark
public void toCharArray(Data data, Blackhole b) {
char[] chars = data.string.toCharArray();
for (char ch : chars) {
b.consume(ch);
}
}
@Benchmark
public void charAt(Data data, Blackhole b) {
String string = data.string;
int length = string.length();
for (int i = 0; i < length; i++) {
b.consume(string.charAt(i));
}
}
@State(Scope.Thread)
public static class Data {
String string;
@Param({"true", "false"})
private boolean latin;
@Param({"5", "10", "50", "100"}) …Run Code Online (Sandbox Code Playgroud) 我将 OpenAPI 3 规范中的参数描述为
review_requests:
get:
tags:
- dashboard
operationId: reviewRequests
parameters:
- name: page
in: query
default: 0
description: Page number
schema:
type: integer
responses:
200:
description: OK
Run Code Online (Sandbox Code Playgroud)
编译后,我发现 Java 代码中缺少默认值,并且参数实际上描述如下:
@Valid @RequestParam(value = "page", required = false) Integer page
Run Code Online (Sandbox Code Playgroud)
如果 GET 请求中未提供参数,则0我不会收到。null据我了解应该是
@Valid @RequestParam(value = "page", required = false, defaultValue = "0") Integer page
Run Code Online (Sandbox Code Playgroud)
这是一个错误还是我做错了什么?
JEP 306在 Java 17 中实现,提供始终严格的浮点语义,弃用该strictfp标志。这是否意味着java.lang.Math可以指望其行为与 中的类似方法完全相同StrictMath(即,该java.lang.Math方法不能再被 JVM 替换为过去所允许的内在函数)?这是否也意味着无论使用哪个库,不同架构之间的浮点数学结果不应再有任何差异?
我很好奇我是否误解了新的 Java 17 功能,因为我们确实看到 Apple Silicon 与 Intel 之间今天的代码存在差异。
在调查与 Spring 的实例化相关的问题时org.springframework.util.ConcurrentReferenceHashMap(截至spring-core-5.1.3.RELEASE),我使用LinuxPerfAsmProfiler与 JMH 一起提供的工具来分析生成的程序集。
我只是运行这个
@Benchmark
public Object measureInit() {
return new ConcurrentReferenceHashMap<>();
}
Run Code Online (Sandbox Code Playgroud)
JDK 8 上的基准测试允许识别不明显的热点之一:
0.61% 0x00007f32d92772ea: lock addl $0x0,(%rsp) ;*putfield count
; - org.springframework.util.ConcurrentReferenceHashMap$Segment::<init>@11 (line 476)
; - org.springframework.util.ConcurrentReferenceHashMap::<init>@141 (line 184)
15.81% 0x00007f32d92772ef: mov 0x60(%r15),%rdx
Run Code Online (Sandbox Code Playgroud)
这对应于对 volatile 字段的不必要的默认值分配:
0.61% 0x00007f32d92772ea: lock addl $0x0,(%rsp) ;*putfield count
; - org.springframework.util.ConcurrentReferenceHashMap$Segment::<init>@11 (line 476)
; - org.springframework.util.ConcurrentReferenceHashMap::<init>@141 (line 184)
15.81% 0x00007f32d92772ef: mov 0x60(%r15),%rdx
Run Code Online (Sandbox Code Playgroud)
并Segment依次在以下构造函数的循环中实例化CCRHM:
protected final class Segment extends ReentrantLock …Run Code Online (Sandbox Code Playgroud) 我想知道是否有一种方法可以查看 Elasticsearch 参数的默认值(例如在 Kibana 中),并在必要时通过 DevTools 的控制台或?部分search.allow_expensive_queries进行更改。environmentdocker-compose.yml