1. A Buffer
เป็นเพียงมุมมองสำหรับการค้นหาไฟล์ArrayBuffer
ไฟล์.
A Buffer
ในความเป็นจริงคือ a FastBuffer
ซึ่งextends
(สืบทอดมาจาก) Uint8Array
ซึ่งเป็นมุมมองหน่วยออกเตต(“ ตัวเข้าถึงบางส่วน”) ของหน่วยความจำจริง a ArrayBuffer
.
📜 โหนด js 9.4.0/lib/buffer.js#L65-L73
class FastBuffer extends Uint8Array {
constructor(arg1, arg2, arg3) {
super(arg1, arg2, arg3);
}
}
FastBuffer.prototype.constructor = Buffer;
internalBuffer.FastBuffer = FastBuffer;
Buffer.prototype = FastBuffer.prototype;
2. ขนาดของArrayBuffer
และขนาดของมุมมองอาจแตกต่างกันไป
เหตุผล # 1: Buffer.from(arrayBuffer[, byteOffset[, length]])
1:
ด้วยBuffer.from(arrayBuffer[, byteOffset[, length]])
คุณสามารถสร้างBuffer
ด้วยการระบุพื้นฐานArrayBuffer
และตำแหน่งและขนาดของมุมมอง
const test_buffer = Buffer.from(new ArrayBuffer(50), 40, 10);
console.info(test_buffer.buffer.byteLength);
console.info(test_buffer.length);
เหตุผล # 2: FastBuffer
จัดสรรหน่วยความจำ
จัดสรรหน่วยความจำในสองวิธีที่แตกต่างกันขึ้นอยู่กับขนาด
- หากขนาดน้อยกว่าครึ่งหนึ่งของขนาดของพูลหน่วยความจำและไม่ใช่ 0 (“ เล็ก”) : จะใช้พูลหน่วยความจำเพื่อเตรียมหน่วยความจำที่ต้องการ
- อื่น ๆ : มันสร้างเฉพาะ
ArrayBuffer
ที่เหมาะกับหน่วยความจำที่ต้องการ
📜 โหนด js 9.4.0/lib/buffer.js#L306-L320
function allocate(size) {
if (size <= 0) {
return new FastBuffer();
}
if (size < (Buffer.poolSize >>> 1)) {
if (size > (poolSize - poolOffset))
createPool();
var b = new FastBuffer(allocPool, poolOffset, size);
poolOffset += size;
alignPool();
return b;
} else {
return createUnsafeBuffer(size);
}
}
📜 โหนด js 9.4.0/lib/buffer.js#L98-L100
function createUnsafeBuffer(size) {
return new FastBuffer(createUnsafeArrayBuffer(size));
}
คุณหมายถึงอะไรโดย " หน่วยความจำ "
สระว่ายน้ำของหน่วยความจำเป็นขนาดคงที่ก่อนจัดสรรบล็อกหน่วยความจำสำหรับการเก็บรักษาชิ้นหน่วยความจำขนาดเล็กสำหรับBuffer
s การใช้มันช่วยให้หน่วยความจำขนาดเล็กเข้าด้วยกันอย่างแน่นหนาดังนั้นจึงป้องกันการแยกส่วนที่เกิดจากการจัดการแยกต่างหาก (การจัดสรรและการจัดสรร) ของหน่วยความจำขนาดเล็ก
ในกรณีนี้พูลหน่วยความจำคือArrayBuffer
s ที่มีขนาด 8 KiB ตามค่าเริ่มต้นซึ่งระบุไว้ในBuffer.poolSize
. เมื่อต้องการให้หน่วยความจำขนาดเล็กสำหรับ a Buffer
จะตรวจสอบว่าพูลหน่วยความจำสุดท้ายมีหน่วยความจำเพียงพอที่จะจัดการสิ่งนี้หรือไม่ ถ้าเป็นเช่นนั้นมันจะสร้างBuffer
ที่“มุมมอง”ที่ได้รับก้อนบางส่วนของสระว่ายน้ำของหน่วยความจำมิฉะนั้นมันจะสร้างสระว่ายน้ำหน่วยความจำใหม่และอื่น ๆ
คุณสามารถเข้าถึงพื้นฐานArrayBuffer
ของไฟล์Buffer
. Buffer
's buffer
คุณสมบัติ (นั่นคือสืบทอดมาจากUint8Array
) ถือมัน “เล็ก”ของสถานที่ให้บริการเป็นที่หมายถึงสระว่ายน้ำของหน่วยความจำทั้งหมด ดังนั้นในกรณีนี้และแตกต่างกันไปในขนาด Buffer
buffer
ArrayBuffer
ArrayBuffer
Buffer
const zero_sized_buffer = Buffer.allocUnsafe(0);
const small_buffer = Buffer.from([0xC0, 0xFF, 0xEE]);
const big_buffer = Buffer.allocUnsafe(Buffer.poolSize >>> 1);
console.info(zero_sized_buffer.length);
console.info(zero_sized_buffer.buffer.byteLength);
console.info(Buffer.poolSize);
console.info(small_buffer.length);
console.info(small_buffer.buffer.byteLength);
console.info(Buffer.poolSize);
console.info(big_buffer.length);
console.info(big_buffer.buffer.byteLength);
console.info(Buffer.poolSize);
3. ดังนั้นเราต้องดึงหน่วยความจำออกมา " ดู "
ArrayBuffer
ได้รับการแก้ไขในขนาดดังนั้นเราจึงจำเป็นที่จะดึงมันออกมาด้วยการทำสำเนาส่วนที่ การทำเช่นนี้เราจะใช้Buffer
ของbyteOffset
สถานที่ให้บริการและlength
สถานที่ให้บริการที่ได้รับมาจากUint8Array
และวิธีการซึ่งทำให้สำเนาส่วนหนึ่งของการเป็น วิธีไอเอ็นจีในเอกสารฉบับนี้ได้รับแรงบันดาลใจจาก@ZachBArrayBuffer.prototype.slice
ArrayBuffer
slice()
const test_buffer = Buffer.from(new ArrayBuffer(10));
const zero_sized_buffer = Buffer.allocUnsafe(0);
const small_buffer = Buffer.from([0xC0, 0xFF, 0xEE]);
const big_buffer = Buffer.allocUnsafe(Buffer.poolSize >>> 1);
function extract_arraybuffer(buf)
{
return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.length);
}
const test_arraybuffer = extract_arraybuffer(test_buffer);
const zero_sized_arraybuffer = extract_arraybuffer(zero_sized_buffer);
const small_arraybuffer = extract_arraybuffer(small_buffer);
const big_arraybuffer = extract_arraybuffer(big_buffer);
console.info(test_arraybuffer.byteLength);
console.info(zero_sized_arraybuffer.byteLength);
console.info(small_arraybuffer.byteLength);
console.info(big_arraybuffer.byteLength);
4. การปรับปรุงประสิทธิภาพ
หากคุณจะใช้ผลลัพธ์เป็นแบบอ่านอย่างเดียวหรือสามารถแก้ไขBuffer
เนื้อหาของอินพุตได้คุณสามารถหลีกเลี่ยงการคัดลอกหน่วยความจำที่ไม่จำเป็นได้
const test_buffer = Buffer.from(new ArrayBuffer(10));
const zero_sized_buffer = Buffer.allocUnsafe(0);
const small_buffer = Buffer.from([0xC0, 0xFF, 0xEE]);
const big_buffer = Buffer.allocUnsafe(Buffer.poolSize >>> 1);
function obtain_arraybuffer(buf)
{
if(buf.length === buf.buffer.byteLength)
{
return buf.buffer;
}
return buf.subarray(0, buf.length);
}
const test_arraybuffer = obtain_arraybuffer(test_buffer);
const zero_sized_arraybuffer = obtain_arraybuffer(zero_sized_buffer);
const small_arraybuffer = obtain_arraybuffer(small_buffer);
const big_arraybuffer = obtain_arraybuffer(big_buffer);
console.info(test_arraybuffer.byteLength);
console.info(zero_sized_arraybuffer.byteLength);
console.info(small_arraybuffer.byteLength);
console.info(big_arraybuffer.byteLength);