簡體   English   中英

JavaScript中的布爾值數組

[英]Array of boolean values in JavaScript

在JavaScript中,有沒有一種方法可以更有效地做到這一點?

我需要創建一個布爾值數組,更改它們並分別並隨機檢查它們。

目標是更好的性能。 也許操縱位。

現在我用這樣的東西:

var boolean = [];

var length = 100; // set a random number of values
for (var i = 0; i < length; i++) boolean[i] = false; // or true

boolean[n] = true; // change some of the values randomly
if (boolean[n]) { /* something */ } // check some of the values randomly

因此,這包括三個部分:

  1. 創建數組

    有點違反直覺的是,即使標准JavaScript數組根本不是真正的數組 ,您所做的也已經足夠好了 ,因為在創建和填充數組的方式中,現代引擎將在場景。 (有關此問題的更多信息,請參見我對另一個問題的回答 ,包括性能測試。)因此,即使在具有真正數組(例如Uint8Array )的引擎上,您所做的也很好。 但是請參閱下面的第二點。

  2. 用假值填充它

    因為只有100個條目,所以執行此操作無關緊要,除非您要在緊密的循環中重復創建和填充數組。 如果是的話,那么Uint8Array應該會獲勝,因為new Uint8Array(100)會預先填充零,而您根本不必填寫。

  3. 訪問數組的條目

    您實際上沒有太多選擇,可以按照自己的方式來做。 如果您以自己的方式創建數組,或者使用Uint8Array ,那么它的速度可能會與所獲得的一樣快。

我發現http://jsperf.com對於比較事物的方法以及在現實世界的JavaScript引擎上觀察它們的效果很有幫助。 舉例來說,這里是一個測試用例這表明Uint8Array將提供一個微弱的優勢上的SpiderMonkey(Firefox的引擎),是關於V8(Chrome的引擎)是相同的,並且非常稍微慢一點上的JScript(IE11的引擎):

標准陣列:

var a, n, dead;

// Creation
a = [];

// Filling
for (n = 0; n < 100; ++n) {
    a[n] = false;
}

// Accessing randomly 5,000 times
dead = 1;
for (n = 0; n < 5000; ++n) {
    a[Math.floor(Math.random() * a.length)] = true;
    if (a[Math.floor(Math.random() * a.length)]) {
        ++dead; // Just to be doing something
    }
}

// Make sure engine knows we're using the result
if (dead === 0) { throw "Error in test"; }

Uint8Array

var a, n, dead;

// Creation
a = new Uint8Array(100);

// Filling
// None!

// Accessing randomly 5,000 times
dead = 1;
for (n = 0; n < 5000; ++n) {
    a[Math.floor(Math.random() * a.length)] = 1;
    if (a[Math.floor(Math.random() * a.length)]) {
        ++dead; // Just to be doing something
    }
}

// Make sure engine knows we're using the result
if (dead === 0) { throw "Error in test"; }

在Chrome,Firefox和IE11上的結果:

在此處輸入圖片說明

可能是這樣

var length = 100,
    item,
    arr = (Array(length)).fill(1),
    getRandBool = function() { return Math.random(Date()) * 10 > 6; },
    getRandIdx = function() { return (Math.random(Date()) * (length + 1))|0; };

arr.forEach(function(val, idx) { arr[idx]= getRandBool(); });

arr[getRandIdx()] = getRandBool();


if(item = arr[getRandIdx()]) { console.log(item) }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM