SharedArrayBuffer
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2021å¹´12æ.
* Some parts of this feature may have varying levels of support.
SharedArrayBuffer ãªãã¸ã§ã¯ãã¯ãä¸è¬çãªãçã®ãã¤ããªã¼ãã¼ã¿ãããã¡ã¼ã表ãããã«ä½¿ç¨ããã¾ããArrayBuffer ãªãã¸ã§ã¯ãã¨ä¼¼ã¦ãã¾ããããã¡ãã¯å
±æã¡ã¢ãªã¼ä¸ã«ãã¥ã¼ãçæããããã«ä½¿ç¨ããã¾ããSharedArrayBuffer ã¯ç§»è²å¯è½ãªãã¸ã§ã¯ãã§ã¯ããã¾ããããã®ç¹ã§ã¯ ArrayBuffer ãç§»è²å¯è½ã§ããã®ã¨ã¯ç°ãªãã¾ãã
解説
SharedArrayBuffer ãªãã¸ã§ã¯ãã使ç¨ãã¦ãã¯ã©ã¹ã¿ã¼å
ã®ããã¨ã¼ã¸ã§ã³ãããå¥ã®ã¨ã¼ã¸ã§ã³ã (ã¨ã¼ã¸ã§ã³ãã¨ã¯ãã¦ã§ããã¼ã¸ã®ã¡ã¤ã³ããã°ã©ã ã¾ãã¯ãã®ã¦ã§ãã¯ã¼ã«ã¼ã®ã²ã¨ã¤) ã¸ãSharedArrayBuffer ãªãã¸ã§ã¯ãã使ç¨ãã¦ã¡ã¢ãªã¼ãå
±æããããã«ãpostMessage ã¨æ§é åè¤è£½ã使ç¨ãã¾ãã
æ§é åè¤è£½ã¢ã«ã´ãªãºã 㯠SharedArrayBuffer ã¨ãSharedArrayBuffer ã«ãããã³ã°ãããåä»ãé
åãåãå
¥ãã¾ããã©ã¡ãã®å ´åã SharedArrayBuffer ãªãã¸ã§ã¯ãã¯åä¿¡è
ã«è»¢éããã¦ãåä¿¡å´ã®ã¨ã¼ã¸ã§ã³ãã§æ°ããªãã©ã¤ãã¼ãã® SharedArrayBuffer ãªãã¸ã§ã¯ãã«ãªãã¾ãï¼ArrayBuffer ã¨åãããã«ï¼ããããã2 ã¤ã® SharedArrayBuffer ãªãã¸ã§ã¯ãããåç
§ãããå
±æãã¼ã¿ãããã¯ã¯åä¸ã®ãã¼ã¿ãããã¯ã§ãããããã¨ã¼ã¸ã§ã³ãã«ãããããã¯ã¸ã®å¯ä½ç¨ã¯ãçµæçã«ä»æ¹ã®ã¨ã¼ã¸ã§ã³ããããè¦ãã¾ãã
const sab = new SharedArrayBuffer(1024);
worker.postMessage(sab);
å ±æã¡ã¢ãªã¼ã¯ãã¯ã¼ã«ã¼å ã§ãã¡ã¤ã³ã¹ã¬ããå ã§ãåæã«çæãæ´æ°ãã§ãã¾ããã·ã¹ãã (CPUãOSããã©ã¦ã¶ã¼) ã«ãã£ã¦ã¯ã夿´ããã¹ã¦ã®ã³ã³ããã¹ãã«éç¥ãããã¾ã§ã«å°ã æéããããã¾ããåæããããã«ã¯ãä¸å¯åæä½ãå¿ è¦ã§ãã
SharedArrayBuffer ãªãã¸ã§ã¯ãã¯ã以ä¸ã®ããã«ä¸é¨ã®ã¦ã§ã API ã§ä½¿ç¨ããã¦ãã¾ãã
ã»ãã¥ãªãã£è¦ä»¶
å ±æã¡ã¢ãªã¼ã¨é«è§£å度ã¿ã¤ãã¼ã¯ãSpectre ã®å¯¾çã¨ã㦠2018 å¹´ã®åãã«äºå®ä¸ç¡å¹åããã¾ããã 2020 å¹´ã«ã¯ãå ±æã¡ã¢ãªã¼ãåã³æå¹ã«ããããã«ãæ°ããå®å ¨ãªã¢ããã¼ããæ¨æºåããã¾ããã
å
±æã¡ã¢ãªã¼ã使ç¨ããã«ã¯ãææ¸ãä¿è·ãããã³ã³ããã¹ãå
ã«ããããªãªã¸ã³å士ãåé¢ããã¦ããå¿
è¦ãããã¾ãã
Window.crossOriginIsolated 㨠WorkerGlobalScope.crossOriginIsolated ã®ããããã£ã使ç¨ãã¦ãææ¸ã®ãªãªã¸ã³å士ãåé¢ããã¦ãããã©ããã調ã¹ããã¨ãã§ãã¾ãã
const myWorker = new Worker("worker.js");
if (crossOriginIsolated) {
const buffer = new SharedArrayBuffer(16);
myWorker.postMessage(buffer);
} else {
const buffer = new ArrayBuffer(16);
myWorker.postMessage(buffer);
}
ãªãªã¸ã³å士ãåé¢ããã¦ããå ´åã postMessage() 㯠SharedArrayBuffer ãªãã¸ã§ã¯ãã«ä¾å¤ãçºçãããªããªããå¾ã£ã¦ã¹ã¬ããéã§ã®å
±æã¡ã¢ãªã¼ãå©ç¨ã§ããããã«ãªãã¾ãã
API ã®å©ç¨å¯è½æ§
ä¸è¨ã®ã»ãã¥ãªãã£å¯¾çã®æç¡ã«ãããå種ã¡ã¢ãªã¼å ±æ API ã®å©ç¨å¯è½æ§ã¯ç°ãªãã¾ãã
Atomicsãªãã¸ã§ã¯ãã¯å¸¸ã«å©ç¨ã§ãã¾ããSharedArrayBufferãªãã¸ã§ã¯ãã¯ååã¨ãã¦å¸¸ã«å©ç¨ã§ãã¾ãããæ®å¿µãªãããã¦ã§ãã³ã³ãã³ãã¨ã®äºææ§ã®ããã«ãä¸è¨ã® 2 ã¤ã®ãããã¼ãè¨å®ããã¦ããªãéããã°ãã¼ãã«ãªãã¸ã§ã¯ãã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã¯é ããã¾ãããã®å¶éã¯å°æ¥çã«åãé¤ããããã¨ãæå¾ ããã¦ãã¾ããWebAssembly.Memoryã¯ã¾ã ã¤ã³ã¹ã¿ã³ã¹ãåå¾ããããã«ä½¿ç¨ãããã¨ãã§ãã¾ãã- ä¸è¨ã® 2 ã¤ã®ãããã¼ãè¨å®ããã¦ããªãéãããã¾ãã¾ãª
postMessage()API ãSharedArrayBufferãªãã¸ã§ã¯ãã«å¯¾ãã¦ä¾å¤ãçºçãããã¨ã«ãªãã¾ããããããè¨å®ãããå ´åã¯ãWindowãªãã¸ã§ã¯ãã¨å°ç¨ã¯ã¼ã«ã¼ã®postMessage()ãæ©è½ããã¡ã¢ãªã¼ãå ±æã§ããããã«ãªãã¾ãã
WebAssembly ã®å ±æã¡ã¢ãªã¼
WebAssembly.Memory ãªãã¸ã§ã¯ãã¯ãã³ã³ã¹ãã©ã¯ã¿ã¼ã® shared ãã©ã°ã§ä½æãããã¨ãã§ãã¾ãããã®ãã©ã°ã true ã«è¨å®ããã¨ãæ§ç¯ãããã¡ã¢ãªã¼ãªãã¸ã§ã¯ã㯠SharedArrayBuffer ã¨åæ§ã« postMessage() ãéãã¦ã¯ã¼ã«ã¼éã§å
±æã§ããã¡ã¢ãªã¼ãªãã¸ã§ã¯ãã®èå¾ã¨ãªã buffer 㯠SharedArrayBuffer ã¨ãªãã¾ãããããã£ã¦ãã¯ã¼ã«ã¼éã§ SharedArrayBuffer ãå
±æããããã®ä¸è¨ã®è¦ä»¶ã¯ãWebAssembly.Memory.Buffer ãå
±æããå ´åã«ãå½ã¦ã¯ã¾ãã¾ãã
WebAssembly Threads ã®ææ¡ã§ã¯ãæ°ããä¸å¯åå½ä»¤ã®éåãå®ç¾©ããã¦ãã¾ãã SharedArrayBuffer ã¨ãã®ã¡ã½ãããç¡æ¡ä»¶ã«æå¹ã§ããããã«ï¼ããã¦ã¹ã¬ããéã®å
±æã®ã¿ãæ°ãããããã¼ä¸ã§å¶éããã¾ãï¼ã WebAssembly ã®ä¸å¯åå½ä»¤ãç¡æ¡ä»¶ã«è¨±å¯ããã¾ãã
SharedArrayBuffer ã®æé·
SharedArrayBuffer ãªãã¸ã§ã¯ã㯠SharedArrayBuffer() ã³ã³ã¹ãã©ã¯ã¿ã¼ãå¼ã³åºãéã« maxByteLength ãªãã·ã§ã³ãå«ãããã¨ã§æé·å¯è½ã«ãããã¨ãã§ãã¾ããã¾ããSharedArrayBuffer ã® growable ããã³ maxByteLength ããããã£ãåç
§ããã°ããã®ãµã¤ãºãæé·å¯è½ãã©ããã調ã¹ããã¨ãå¯è½ã§ãããæå¤§ãµã¤ãºã¯ä½ã§ãããããããã¾ããæé·å¯è½ãª SharedArrayBuffer ã«ã¯ grow() ãå¼ã³åºãã¦æ°ãããµã¤ãºãå²ãå½ã¦ããã¨ãã§ãã¾ããæ°ãããã¤ã㯠0 ã«åæåããã¾ãã
ãããã®æ©è½ã«ãããSharedArrayBuffer ãããå¹ççã«æé·ããããã¨ãã§ãã¾ããããããªãã¨ãæ°ãããµã¤ãºã®ãããã¡ã¼ã³ãã¼ã使ããªããã°ãªãã¾ãããã¾ãããã®ç¹ã«ããã¦ãJavaScript 㯠WebAssembly ã¨åçã«ãªãã¾ãï¼Wasm ã®ãªãã¢ã¡ã¢ãªã¼ã¯ WebAssembly.Memory.prototype.grow() ã§ãµã¤ãºã夿´ãããã¨ãã§ãã¾ãï¼ã
ã»ãã¥ãªãã£ä¸ã®çç±ãããSharedArrayBuffer ã¯ãµã¤ãºã縮å°ãããã¨ã¯ã§ãã¾ãããã大ãããããã¨ã¯ã§ãã¾ãã
ã³ã³ã¹ãã©ã¯ã¿ã¼
-
æ°ãã
SharedArrayBufferãªãã¸ã§ã¯ããçæãã¾ãã
éçããããã£
-
SharedArrayBufferã®ã¡ã½ããããè¿å¤ãæ§ç¯ããéã«ä½¿ç¨ãããã³ã³ã¹ãã©ã¯ã¿ã¼ãè¿ãã¾ãã
ã¤ã³ã¹ã¿ã³ã¹ããããã£
ãããã®ããããã£ã¯ SharedArrayBuffer.prototype ã§å®ç¾©ããã¦ããããã¹ã¦ã® SharedArrayBuffer ã¤ã³ã¹ã¿ã³ã¹ã§å
±æããã¾ãã
-
é åã®ãµã¤ãºï¼ãã¤ãåä½ï¼ãããã¯é åã®æ§ç¯æã«è¨å®ããã
SharedArrayBufferãæé·å¯è½ã§ããå ´åã«ã®ã¿SharedArrayBuffer.prototype.grow()ã¡ã½ããã使ç¨ãã¦å¤æ´ãããã¨ãã§ãã¾ãã -
ã¤ã³ã¹ã¿ã³ã¹ãªãã¸ã§ã¯ãã使ããã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ã§ããSharedArrayBuffer`ã¤ã³ã¹ã¿ã³ã¹ã®å ´åãåæå¤ã¯
SharedArrayBufferã³ã³ã¹ãã©ã¯ã¿ã¼ã§ãã -
èªã¿åãå°ç¨ã§ãã
SharedArrayBufferãæé·å¯è½ãªå ´åã¯trueããããã§ãªãå ´åã¯falseãè¿ãã¾ãã -
èªã¿åãå°ç¨ã§ã
SharedArrayBufferãæé·ã§ããæå¤§é·ããã¤ãæ°ã§æå®ãã¾ããããã¯é åãæ§ç¯ãããéã«è¨å®ããã夿´ãããã¨ã¯ã§ãã¾ããã -
[Symbol.toStringTag]ããããã£ã®åæå¤ã¯æåå"SharedArrayBuffer"ã§ãããã®ããããã£ã¯Object.prototype.toString()ã§ä½¿ç¨ããã¾ãã
ã¤ã³ã¹ã¿ã³ã¹ã¡ã½ãã
-
SharedArrayBufferãæå®ãããµã¤ãºï¼ãã¤ãåä½ï¼ã¾ã§æé·ããã¾ãã -
æ°ãã
SharedArrayBufferã使ãããã®ä¸èº«ããã®SharedArrayBufferã®beginã®ä½ç½®ããendã®ä½ç½®ã®ä¸ã¤æåã¾ã§ã®ãã¤ããã³ãã¼ãã¦è¿ãã¾ããbeginã¾ãã¯endãè² ã®æ°ã®å ´åã¯ãé åã®å é ããã§ã¯ãªãæ«å°¾ããã®ä½ç½®ã§åç §ãã¾ãã
ä¾
ãããã®ä¾ã¯ãã³ã³ã½ã¼ã«ãä»»æã®ã¦ã§ããã¼ã¸ããç´æ¥å®è¡ãããã¨ã¯ã§ãã¾ãããSharedArrayBuffer ã¯ããã®ã»ãã¥ãªãã£è¦ä»¶ãæºããããªãéãå®ç¾©ãããªãããã§ãã
æ°ãã SharedArrayBuffer ã®çæ
const sab = new SharedArrayBuffer(1024);
SharedArrayBuffer ã®åå²
sab.slice(); // SharedArrayBuffer { byteLength: 1024 }
sab.slice(2); // SharedArrayBuffer { byteLength: 1022 }
sab.slice(-2); // SharedArrayBuffer { byteLength: 2 }
sab.slice(0, 1); // SharedArrayBuffer { byteLength: 1 }
WebGL ãããã¡ã¼å ã§ã®ä½¿ç¨
const canvas = document.querySelector("canvas");
const gl = canvas.getContext("webgl");
const buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.bufferData(gl.ARRAY_BUFFER, sab, gl.STATIC_DRAW);
仿§æ¸
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-sharedarraybuffer-objects> |
ãã©ã¦ã¶ã¼ã®äºææ§
é¢é£æ å ±
AtomicsArrayBuffer- JavaScript åä»ãé åã¬ã¤ã
- ã¦ã§ãã¯ã¼ã«ã¼
- å ±æã¡ã¢ãªã¼ â ç°¡æ½ãªãã¥ã¼ããªã¢ã« (TC39 ecmascript-sharedmem ã®ææ¡)
- A Taste of JavaScript's New Parallel Primitives (hacks.mozilla.org, 2016)
- COOP and COEP explained (the Chrome team, 2020)
Cross-Origin-Opener-PolicyCross-Origin-Embedder-PolicyCross-Origin-Resource-PolicyWindow.crossOriginIsolatedããã³WorkerGlobalScope.crossOriginIsolated- SharedArrayBuffer updates in Android Chrome 88 and Desktop Chrome 92 (developer.chrome.com, 2021)