[英]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
因此,這包括三個部分:
創建數組
有點違反直覺的是,即使標准JavaScript數組根本不是真正的數組 ,您所做的也已經足夠好了 ,因為在創建和填充數組的方式中,現代引擎將在場景。 (有關此問題的更多信息,請參見我對另一個問題的回答 ,包括性能測試。)因此,即使在具有真正數組(例如Uint8Array
)的引擎上,您所做的也很好。 但是請參閱下面的第二點。
用假值填充它
因為只有100個條目,所以執行此操作無關緊要,除非您要在緊密的循環中重復創建和填充數組。 如果是的話,那么Uint8Array
應該會獲勝,因為new Uint8Array(100)
會預先填充零,而您根本不必填寫。
訪問數組的條目
您實際上沒有太多選擇,可以按照自己的方式來做。 如果您以自己的方式創建數組,或者使用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.