031-JVM-書込み結合
2022-02-19 12:55:56
Previous: 030-JVM-Cache Line, Cache Alignment, Pseudo-Sharing https://yuhongliang.blog.csdn.net/article/details/112099904
CPUが値を変更すると、L1にデータラインを預けますが、この時はヒットしないかもしれません、その後、一度下を向いてL2に書き込みます、この時、L2への書き込みに多くの時間がかかるため、同時にこの変数は変更され続けるかもしれません、この時、マージ書き込みのテクニックが使われます、いわゆるマージ書き込みとは2つの書き込みの結果を一度に書き込むことを指します。
ここで使われているマージシューのアドレス空間は全部で4バイトで、つまりこちらの修正が4バイト以内であればマージライトのテクニックが使われ、4バイト以上であればマージライトのボーナスは使えないということです。
以下にその例を示します。
1. 一度に6バイトを書き込む
package com.yuhl.c2020;
/**
* @author yuhl
* @Date 2021/1/3 15:20
* @Classname WriteCombining
* @Description Combining Write
*/
public class WriteCombining {
private static final int ITERATIONS = Integer.MAX_VALUE;
private static final int ITEMS = 1 << 24;
private static final int MASK = ITEMS - 1;
private static final byte[] arrayA = new byte[ITEMS];
private static final byte[] arrayB = new byte[ITEMS];
private static final byte[] arrayC = new byte[ITEMS];
private static final byte[] arrayD = new byte[ITEMS];
private static final byte[] arrayE = new byte[ITEMS];
private static final byte[] arrayF = new byte[ITEMS];
public static void main(final String[] args) {
for (int i = 1; i <= 3; i++) {
System.out.println(i + " SingleLoop duration (ns) = " + runCaseOne());
System.out.println(i + " SplitLoop duration (ns) = " + runCaseTwo());
}
}
public static long runCaseOne() {
long start = System.nanoTime();
int i = ITERATIONS;
while (--i ! = 0) {
int slot = i & MASK;
byte b = (byte) i;
arrayA[slot] = b;
arrayB[slot] = b;
arrayC[slot] = b;
arrayD[slot] = b;
arrayE[slot] = b;
arrayF[slot] = b;
}
return System.nanoTime() - start;
}
public static long runCaseTwo() {
long start = System.nanoTime();
int i = ITERATIONS;
while (--i ! = 0) {
int slot = i & MASK;
byte b = (byte) i;
arrayA[slot] = b;
arrayB[slot] = b;
arrayC[slot] = b;
}
i = ITERATIONS;
while (--i ! = 0) {
int slot = i & MASK;
byte b = (byte) i;
arrayD[slot] = b;
arrayE[slot] = b;
arrayF[slot] = b;
}
return System.nanoTime() - start;
}
}
結論
1 SingleLoop duration (ns) = 8619677900
1 SplitLoop duration (ns) = 7768035100
2. 3バイトずつ書いて、2回に分けて、6バイトも書く
SplitLoopの方が効率的です。
3. 概要
上記の例の結論は、3バイトずつ2回に分けて書き込むと、マージライトの技術支援を使って6バイトも速くなり、6バイトずつ書き込むと毎回L2ライトが必要で効率が落ちることを説明している。
次へ 032-JVM-Instructions-rearrangement 検証 https://yuhongliang.blog.csdn.net/article/details/112135527
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
ハートビート・エフェクトのためのHTML+CSS
-
HTML ホテル フォームによるフィルタリング
-
HTML+cssのボックスモデル例(円、半円など)「border-radius」使いやすい
-
HTMLテーブルのテーブル分割とマージ(colspan, rowspan)
-
ランダム・ネームドロッパーを実装するためのhtmlサンプルコード
-
Html階層型ボックスシャドウ効果サンプルコード
-
QQの一時的なダイアログボックスをポップアップし、友人を追加せずにオンラインで話す効果を達成する方法
-
sublime / vscodeショートカットHTMLコード生成の実装
-
HTMLページを縮小した後にスクロールバーを表示するサンプルコード
-
html のリストボックス、テキストフィールド、ファイルフィールドのコード例