validating - Introducing JMH

It's impossible to write JMH code to run it from the command line, but recommended approach is to let the JMH system run the tests for we. 

JMH attempts to make benchmarks as easy as possible.

// validating/jmh/JMH1.java
// (c)2017 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.
package validating.jmh;

import java.util.*;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;

@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
// Increase these three for more accuracy:
@Warmup(iterations = 5) 
@Measurement(iterations = 5)
@Fork(1)
public class JMH1 {
  private long[] la;

  @Setup
  public void setup() {
    la = new long[250_000_000];
  }

  @Benchmark
  public void setAll() {
    Arrays.setAll(la, n -> n);
  }

  @Benchmark
  public void parallelSetAll() {
    Arrays.parallelSetAll(la, n -> n);
  }
}
// validating/jmh/JMH2.java
// (c)2017 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.
package validating.jmh;

import java.util.*;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;

@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Warmup(iterations = 5)
@Measurement(iterations = 5)
@Fork(1)
public class JMH2 {
  private long[] la;

  @Param({
    "1",
    "10",
    "100",
    "1000",
    "10000",
    "100000",
    "1000000",
    "10000000",
    "100000000",
    "250000000"
  })
  int size;

  @Setup
  public void setup() {
    la = new long[size];
  }

  @Benchmark
  public void setAll() {
    Arrays.setAll(la, n -> n);
  }

  @Benchmark
  public void parallelSetAll() {
    Arrays.parallelSetAll(la, n -> n);
  }
}
// validating/jmh/JMH3.java
// (c)2017 MindView LLC: see Copyright.txt
// We make no guarantees that this code is fit for any purpose.
// Visit http://OnJava8.com for more book information.
package validating.jmh;

import java.util.*;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.*;

@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@Warmup(iterations = 5)
@Measurement(iterations = 5)
@Fork(1)
public class JMH3 {
  private long[] la;

  @Param({
    "1",
    "10",
    "100",
    "1000",
    "10000",
    "100000",
    "1000000",
    "10000000",
    "100000000",
    "250000000"
  })
  int size;

  @Setup
  public void setup() {
    la = new long[size];
  }

  public static long f(long x) {
    long quadratic = 42 * x * x + 19 * x + 47;
    return Long.divideUnsigned(quadratic, x + 1);
  }

  @Benchmark
  public void setAll() {
    Arrays.setAll(la, n -> f(n));
  }

  @Benchmark
  public void parallelSetAll() {
    Arrays.parallelSetAll(la, n -> f(n));
  }
}

My output:

Benchmark               (size)  Mode  Cnt        Score       Error  Units
JMH1.parallelSetAll        N/A  avgt    5   157727.439 ±  6052.117  us/op
JMH1.setAll                N/A  avgt    5   169563.712 ±  6135.280  us/op
JMH2.parallelSetAll          1  avgt    5        0.036 ±     0.001  us/op
JMH2.parallelSetAll         10  avgt    5       19.264 ±     2.765  us/op
JMH2.parallelSetAll        100  avgt    5       16.902 ±     4.910  us/op
JMH2.parallelSetAll       1000  avgt    5       22.066 ±    21.134  us/op
JMH2.parallelSetAll      10000  avgt    5       18.744 ±     4.856  us/op
JMH2.parallelSetAll     100000  avgt    5       33.685 ±     6.873  us/op
JMH2.parallelSetAll    1000000  avgt    5      221.920 ±    71.894  us/op
JMH2.parallelSetAll   10000000  avgt    5     6421.304 ±   365.326  us/op
JMH2.parallelSetAll  100000000  avgt    5    62885.102 ±  1960.576  us/op
JMH2.parallelSetAll  250000000  avgt    5   157213.034 ±  4628.642  us/op
JMH2.setAll                  1  avgt    5        0.001 ±     0.001  us/op
JMH2.setAll                 10  avgt    5        0.004 ±     0.001  us/op
JMH2.setAll                100  avgt    5        0.032 ±     0.004  us/op
JMH2.setAll               1000  avgt    5        0.324 ±     0.019  us/op
JMH2.setAll              10000  avgt    5        3.382 ±     0.135  us/op
JMH2.setAll             100000  avgt    5       36.090 ±     2.067  us/op
JMH2.setAll            1000000  avgt    5      394.066 ±    46.446  us/op
JMH2.setAll           10000000  avgt    5     6507.366 ±   291.420  us/op
JMH2.setAll          100000000  avgt    5    66977.791 ±  4388.401  us/op
JMH2.setAll          250000000  avgt    5   168200.696 ± 10460.397  us/op
JMH3.parallelSetAll          1  avgt    5        0.044 ±     0.005  us/op
JMH3.parallelSetAll         10  avgt    5       19.242 ±     6.843  us/op
JMH3.parallelSetAll        100  avgt    5       18.658 ±     6.920  us/op
JMH3.parallelSetAll       1000  avgt    5       25.622 ±    13.989  us/op
JMH3.parallelSetAll      10000  avgt    5       51.037 ±     3.264  us/op
JMH3.parallelSetAll     100000  avgt    5      354.044 ±    63.255  us/op
JMH3.parallelSetAll    1000000  avgt    5     3042.517 ±   464.108  us/op
JMH3.parallelSetAll   10000000  avgt    5    27311.351 ±  1740.651  us/op
JMH3.parallelSetAll  100000000  avgt    5   201354.372 ±  6309.172  us/op
JMH3.parallelSetAll  250000000  avgt    5   482230.222 ± 34593.250  us/op
JMH3.setAll                  1  avgt    5        0.011 ±     0.001  us/op
JMH3.setAll                 10  avgt    5        0.084 ±     0.002  us/op
JMH3.setAll                100  avgt    5        0.826 ±     0.005  us/op
JMH3.setAll               1000  avgt    5        8.218 ±     0.141  us/op
JMH3.setAll              10000  avgt    5       83.738 ±     0.937  us/op
JMH3.setAll             100000  avgt    5      804.059 ±    16.302  us/op
JMH3.setAll            1000000  avgt    5     8376.048 ±   101.816  us/op
JMH3.setAll           10000000  avgt    5    83754.080 ±   949.626  us/op
JMH3.setAll          100000000  avgt    5   841625.117 ± 15733.665  us/op
JMH3.setAll          250000000  avgt    5  2097034.637 ± 15399.819  us/op

avgt: Average Time

us/op Microseconds per operation

see more info click JMH samples.

 

Aprofiler finds the slow spots so we can look for the easiest, most obvious way speed things up.

Note the difference between profiling and benchmarking. Profiling looks at our completed program working on our actual data, whereas benchmarking looks at an isolated fragment of a program, typically to optimize an algorithm

references:

1. On Java 8 - Bruce Eckel

2. https://github.com/wangbingfeng/OnJava8-Examples/blob/master/validating/jmh/JMH1.java

3. https://github.com/wangbingfeng/OnJava8-Examples/blob/master/validating/jmh/JMH2.java

4. https://github.com/wangbingfeng/OnJava8-Examples/blob/master/validating/jmh/JMH3.java

那你覺得我這七個設計可以嗎? ````yaml # repo-root/kustomization.yaml # 全域入口:聚合平台治理與命名空間層 apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - platform-governance - namespaces # 全域通用標籤,利於觀測/審計 commonLabels: root.io/repo: repo-root root.io/entry: global # 可選:全域 namePrefix/nameSuffix,預設不加以避免資源名漂移 # namePrefix: "" # nameSuffix: "" # 可選:全域生成 ConfigMap/Secret(目前無) # configMapGenerator: [] # secretGenerator: [] # 可選:全域 patches(目前無) # patches: [] ```` ````yaml # repo-root/platform-governance/kustomization.yaml # 平台治理頂層,聚合控制器、政策、觀測稽核 apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - 10-controllers - 20-clusterpolicies - 99-observability commonLabels: app.kubernetes.io/part-of: platform-governance result.io/owner: platform-team root.io/repo: repo-root # 可選:針對治理層單獨定義 namePrefix # namePrefix: "gov-" ```` ````yaml # repo-root/platform-governance/10-controllers/kustomization.yaml # 控制器層:Kyverno 或原生 VAP/VAC 相關控制面資源 # 預設部署至 kyverno 命名空間(Kyverno Chart 安裝時會建立) apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization namespace: kyverno resources: # 若以 Manifest 方式安裝 Kyverno(或改為 HelmRelease 由 Flux/Helm Operator 管理) - kyverno/install.yaml # 原生 ValidatingAdmissionPolicy/PolicyBinding(K8s 1.30+ 穩定) - validating-admission-policy/prevent-foundation-namespace-deletion.yaml # 建議額外補強(選用,視您是否同時採用 VAP/VAC 與 Kyverno): # - validating-admission-policy/base-constraints.yaml # - validating-admission-policy/labels-required.yaml # - validating-admission-policy/psa-enforce.yaml # - validating-admission-policy/require-immutable-annotations.yaml # - validating-admission-policy/require-signed-images-binding.yaml # 以上檔案可先留空/分階段引入;若您確認要加,我可一併提供模板。 commonLabels: app.kubernetes.io/part-of: platform-governance app.kubernetes.io/component: controllers root.io/repo: repo-root # 可選:避免 CRD 尚未註冊導致順序問題,可將 CRD 類資源放在 install.yaml 內最前段 # patches: [] ```` ````yaml # repo-root/platform-governance/20-clusterpolicies/kustomization.yaml # 政策層(以 Kyverno 為例);若採 VAP/VAC,對應轉為 ValidatingAdmissionPolicy 套件 apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - immutable-namespace-meta.yaml - restrict-pod-security.yaml - require-signed-images.yaml commonLabels: app.kubernetes.io/part-of: platform-governance app.kubernetes.io/component: policies root.io/repo: repo-root # 可選:針對不同環境的覆寫(dev/stage/prod) # patches: [] ```` ````yaml # repo-root/platform-governance/99-observability/kustomization.yaml # 觀測稽核層:政策指標與審計日誌轉送 apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - policy-metrics-scrape.yaml - audit-log-forwarding.yaml commonLabels: app.kubernetes.io/part-of: platform-governance app.kubernetes.io/component: observability root.io/repo: repo-root # 若階段性關閉觀測,resources 可改為 [] ```` ````yaml # repo-root/namespaces/kustomization.yaml # 命名空間聚合入口;可加入其他 domain/team 的命名空間資料夾 apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - foundation commonLabels: app.kubernetes.io/part-of: result-namespaces root.io/repo: repo-root # 可選:針對所有 namespaces 子樹套用 namePrefix # namePrefix: "ns-" ```` ````yaml # repo-root/namespaces/foundation/kustomization.yaml # foundation 命名空間基線:Namespace/Quota/LimitRange/NetworkPolicy apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - 00-namespace.yaml - 10-resourcequota.yaml - 20-limitrange.yaml - 30-networkpolicy-deny-all.yaml - 31-networkpolicy-allow-internal.yaml commonLabels: app.kubernetes.io/name: result-foundation app.kubernetes.io/part-of: result-namespaces root.io/repo: repo-root # 可選:針對 foundation 命名空間單點補丁 # patches: [] ````
10-30
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值