Node.js Smalloc

2022-02-26 10:30 更新
穩(wěn)定性: 1 - 試驗(yàn)

類(lèi): smalloc

表示能夠通過(guò)簡(jiǎn)單的內(nèi)存分配器(處理擴(kuò)展原始內(nèi)存的分配)支持的緩存,可供Smalloc使用的函數(shù)如下所示:

smalloc.alloc(length[, receiver][, type])

  • length {Number} <= smalloc.kMaxLength
  • receiver {Object} 默認(rèn): new Object
  • type {Enum} 默認(rèn): Uint8

此函數(shù)的作用為返回包含分配的外部數(shù)組數(shù)據(jù)的receiver對(duì)象。如果沒(méi)有傳入receiver,則將會(huì)創(chuàng)建并返回一個(gè)新的對(duì)象。

這可以用來(lái)創(chuàng)建你自己的類(lèi)似buffer的類(lèi)。不會(huì)設(shè)置其他屬性,因此使用者需要跟蹤其他所需信息(比如分配的長(zhǎng)度)。

function SimpleData(n) {
  this.length = n;
  smalloc.alloc(this.length, this);
}

SimpleData.prototype = { /* ... */ };

僅檢查receiver是否是非數(shù)組的對(duì)象。因此,可以分配擴(kuò)展數(shù)據(jù)數(shù)據(jù),不僅是普通對(duì)象。

function allocMe() { }
smalloc.alloc(3, allocMe);

// { [Function allocMe] '0': 0, '1': 0, '2': 0 }

v8不支持給數(shù)組分配擴(kuò)展數(shù)組對(duì)象,如果這么做,將會(huì)拋出。

你可以指定外部數(shù)組數(shù)據(jù)的類(lèi)型,在smalloc.Types列出了可供使用的外部數(shù)組數(shù)據(jù)的類(lèi)型,例如:

var doubleArr = smalloc.alloc(3, smalloc.Types.Double);

for (var i = 0; i < 3; i++)
  doubleArr = i / 10;

// { '0': 0, '1': 0.1, '2': 0.2 }

使用Object.freeze,Object.sealObject.preventExtensions不能凍結(jié)、封鎖、阻止對(duì)象的使用擴(kuò)展數(shù)據(jù)擴(kuò)展。

smalloc.copyOnto(source, sourceStart, dest, destStart, copyLength);

  • source {Object} 分配了外部數(shù)組的對(duì)象
  • sourceStart {Number} 負(fù)責(zé)的起始位置
  • dest {Object} 分配了外部數(shù)組的對(duì)象
  • destStart {Number} 拷貝到目標(biāo)的起始位置
  • copyLength {Number} 需要拷貝的長(zhǎng)度

將內(nèi)存從一個(gè)外部數(shù)組分配復(fù)制到另一個(gè)數(shù)組中,任何參數(shù)都是可選的,否則會(huì)拋出異常。

var a = smalloc.alloc(4);
var b = smalloc.alloc(4);

for (var i = 0; i < 4; i++) {
  a[i] = i;
  b[i] = i * 2;
}

// { '0': 0, '1': 1, '2': 2, '3': 3 }
// { '0': 0, '1': 2, '2': 4, '3': 6 }

smalloc.copyOnto(b, 2, a, 0, 2);

// { '0': 4, '1': 6, '2': 2, '3': 3 }

copyOnto將自動(dòng)檢測(cè)內(nèi)部分配的長(zhǎng)度,因此不需要設(shè)置任何附加參數(shù)。

smalloc.dispose(obj)

  • obj Object

釋放通過(guò)smalloc.alloc給對(duì)象分配的內(nèi)存。

var a = {};
smalloc.alloc(3, a);

// { '0': 0, '1': 0, '2': 0 }

smalloc.dispose(a);

// {}

這對(duì)于減輕垃圾回收器的負(fù)擔(dān)是有效的,但是在開(kāi)發(fā)的時(shí)候還是要小心,程序里可能會(huì)出現(xiàn)難以跟蹤的錯(cuò)誤。

var a = smalloc.alloc(4);
var b = smalloc.alloc(4);

// perform this somewhere along the line
smalloc.dispose(b);

// now trying to copy some data out
smalloc.copyOnto(b, 2, a, 0, 2);

// now results in:
// RangeError: copy_length > source_length

調(diào)用dispose(),對(duì)象依舊擁有外部數(shù)據(jù),例如smalloc.hasExternalData()會(huì)返回truedispose()不支持緩存,如果傳入將會(huì)拋出。

smalloc.hasExternalData(obj)

  • obj {Object}

如果obj擁有外部分配的內(nèi)存,返回true。

smalloc.kMaxLength

可分配的最大數(shù)量。則同樣適用于緩沖區(qū)的創(chuàng)建。

smalloc.Types

外部數(shù)組的類(lèi)型,包含:

  • Int8
  • Uint8
  • Int16
  • Uint16
  • Int32
  • Uint32
  • Float
  • Double
  • Uint8Clamped


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)