𝗥𝗲𝘀𝗲𝗮𝗿𝗰𝗵 𝗔𝗻𝗱 𝗕𝗲𝗻𝗰𝗵𝗺𝗮𝗿𝗸𝘀 𝗣𝗼𝘄𝗲𝗿𝗳𝘂𝗹𝗹𝘆 𝗦𝗵𝗼𝘄 𝗧𝗵𝗮𝘁 𝗖𝗼𝗻𝗰𝗮𝘁 𝗜𝘀 𝗧𝗵𝗲 𝗕𝗲𝘀𝘁 (මුල් ප්රශ්නය සඳහා)
කරුණු සඳහා, jsperf හි කාර්ය සාධන පරීක්ෂණයක් සහ කොන්සෝලයේ සමහර දේවල් පරීක්ෂා කිරීම සිදු කරනු ලැබේ. පර්යේෂණ සඳහා, irt.org වෙබ් අඩවිය භාවිතා කරයි. පහත දැක්වෙන්නේ මෙම සියලු ප්රභවයන්ගේ එකතුවක් සහ පතුලේ උදාහරණ ශ්රිතයකි.
╔═══════════════╦══════╦═════════════════╦════════ ═══════╦═════════╦══════════╗
║ ක්රමය onConcat║slice & push.apply ║ push.apply x2 ║ ForLoop ║Sread
╠═══════════════╬══════╬═════════════════╬════════ ═══════╬═════════╬══════════╣
MOps / Sec ║179 ║104 ║ 76 81 ║28
╠═══════════════╬══════╬═════════════════╬════════ ═══════╬═════════╬══════════╣
Ar විරල අරා ║ ඔව්! පෙති කපන ලද නැත ║ සමහර විට 2 ║no ║
║ විරල ලෙස තබා ඇත ║ ║ආරේ (1 වන ආර්ග්) ║ ║ ║
╠═══════════════╬══════╬═════════════════╬════════ ═══════╬═════════╬══════════╣
║ සහාය ║MSIE 4║MSIE 5.5 ║ MSIE 5.5 ║ MSIE 4 dEdge 12
║ ( මූලාශ්රය ) ║NNav 4║NNav 4,06 ║ NNav 4,06 ║ NNav 3 ║ MSIE NNav ║
╠═══════════════╬══════╬═════════════════╬════════ ═══════╬═════════╬══════════╣
R අරා-වැනි ක්රියා - තල්ලු කළ පමණින් ඔව්! ඔව්! If තිබේ නම්
රාශියද ║ ║array (2 වන arg) ║ ║ ║iterator ║like 1 ║
╚═══════════════╩══════╩═════════════════╩════════ ═══════╩═════════╩══════════╝
1 අරාව වැනි වස්තුවට Symbol.iterator දේපලක් නොමැති නම්, උත්සාහ කරන්න
පැතිරීමට එය ව්යතිරේකයක් විසි කරයි.
2 කේතය මත රඳා පවතී. පහත දැක්වෙන උදාහරණ කේතය "ඔව්" හිඟකම ආරක්ෂා කරයි.
function mergeCopyTogether(inputOne, inputTwo){
var oneLen = inputOne.length, twoLen = inputTwo.length;
var newArr = [], newLen = newArr.length = oneLen + twoLen;
for (var i=0, tmp=inputOne[0]; i !== oneLen; ++i) {
tmp = inputOne[i];
if (tmp !== undefined || inputOne.hasOwnProperty(i)) newArr[i] = tmp;
}
for (var two=0; i !== newLen; ++i, ++two) {
tmp = inputTwo[two];
if (tmp !== undefined || inputTwo.hasOwnProperty(two)) newArr[i] = tmp;
}
return newArr;
}
ඉහත දැක්වෙන පරිදි, කොන්කට් සෑම විටම පාහේ කාර්ය සාධනය සහ අමතර අරා වල විරල බව රඳවා ගැනීමේ හැකියාව යන දෙකටම යා හැකි මාර්ගය යැයි මම තර්ක කරමි. පසුව, අරාව-කැමති සඳහා (DOMNodeLists වැනි document.body.children
), for for loop භාවිතා කිරීම නිර්දේශ කරමි, මන්ද එය 2 වන වඩාත් කාර්ය සාධනය සහ විරල අරා රඳවා ඇති එකම ක්රමයයි. පහත දැක්වෙන්නේ, ව්යාකූලතා ඉවත් කිරීම සඳහා විරල අරා සහ අරා-කැමති දේවලින් අපි ඉක්මණින් යන්නෙමු.
𝗧𝗵𝗲
මුලදී, සමහර අය සිතන්නේ මෙය නළාවක් බවත් බ්රව්සර් වෙළෙන්දෝ අවසානයේදී Array.prototype.push ප්රශස්තිකරණය කර Array.prototype.concat පරාජය කිරීමට තරම් වේගවත් වනු ඇති බවත්ය. වැරදි! Array.prototype.concat සෑම විටම වේගවත් වනු ඇත (ප්රතිපත්තිමය වශයෙන් අවම වශයෙන්) එය දත්ත වලට වඩා සරල පිටපතක් වන නිසා. බිටු 32 අරාව ක්රියාත්මක කිරීම කෙබඳු විය හැකිද යන්න පිළිබඳ සරල කළ හැකි ඒත්තු ගැන්වීමේ දෘශ්ය රූප සටහනක් පහත දැක්වේ (කරුණාකර සැබෑ ක්රියාත්මක කිරීම් වඩාත් සංකීර්ණ බව සලකන්න)
බයිට් ║ දත්ත මෙහි
═════╬═══════════
0x00 ║ int nonNumericPropertiesLength = 0x00000000
0x01 ib ibid
0x02 ib ibid
0x03 ib ibid
0x00 ║ int දිග = 0x00000001
0x01 ib ibid
0x02 ib ibid
0x03 ib ibid
0x00 ║ int valueIndex = 0x00000000
0x01 ib ibid
0x02 ib ibid
0x03 ib ibid
0x00 ║ int valueType = JS_PRIMITIVE_NUMBER
0x01 ib ibid
0x02 ib ibid
0x03 ib ibid
0x00 ║ uintptr_t valuePointer = 0x38d9eb60 (හෝ එය මතකයේ තිබියදීත්)
0x01 ib ibid
0x02 ib ibid
0x03 ib ibid
ඉහත දැක්වෙන පරිදි, එවැනි දෙයක් පිටපත් කිරීමට ඔබ කළ යුත්තේ බයිට් සඳහා බයිට් පිටපත් කිරීම තරම්ම සරල ය. Array.prototype.push.apply සමඟ, එය දත්ත වලට වඩා සරල පිටපත්-එන්-පේස්ට් වලට වඩා වැඩිය. ".Apply" මඟින් අරාවෙහි ඇති එක් එක් දර්ශකය පරීක්ෂා කර එය Array.prototype.push වෙත යැවීමට පෙර එය තර්ක සමූහයකට පරිවර්තනය කළ යුතුය. එවිට, Array.prototype.push හට සෑම අවස්ථාවකදීම අමතර මතකයක් වෙන් කළ යුතු අතර, (සමහර බ්රව්සර් ක්රියාත්මක කිරීම සඳහා) සමහර විට විරල බව සඳහා ස්ථාන බැලීමේ දත්ත නැවත ගණනය කළ හැකිය.
ඒ ගැන සිතීමට විකල්ප ක්රමයක් මෙයයි. ප්රභව අරාව යනු එකට එකතු කර ඇති විශාල කඩදාසි තොගයකි. ප්රභව අරාව දෙක තවත් විශාල කඩදාසි තොගයකි. එය ඔබට වේගවත් වේවිද?
- ගබඩාවට ගොස්, එක් එක් ප්රභව අරාවෙහි පිටපතක් සඳහා අවශ්ය කඩදාසි මිලදී ගන්න. ඉන්පසු එක් එක් ප්රභව අරා කඩදාසි කැබලි පිටපත් යන්ත්රයක් හරහා දමා එහි ප්රති copy ල පිටපත් දෙක එකට තබන්න.
- ගබඩාවට යන්න, පළමු ප්රභව අරාවේ තනි පිටපතක් සඳහා ප්රමාණවත් කඩදාසි මිලදී ගන්න. ඉන්පසු, හිස් කඩදාසි විරල ස්ථාන පිරවීම සහතික කරමින්, මූලාශ්ර අරා අතින් අතින් පිටපත් කරන්න. ඉන්පසු, නැවත ගබඩාවට ගොස්, දෙවන ප්රභව අරාව සඳහා ප්රමාණවත් කඩදාසි මිලදී ගන්න. ඉන්පසු, දෙවන ප්රභව අරාව හරහා ගොස් පිටපතෙහි හිස් හිඩැස් නොමැති බව සහතික කර එය පිටපත් කරන්න. ඉන්පසු, පිටපත් කරන ලද සියලුම කඩදාසි එකට එකතු කරන්න.
ඉහත ප්රතිසමයේදී, # 1 විකල්පය Array.prototype.concat නියෝජනය කරන අතර # 2 Array.prototype.push.apply නියෝජනය කරයි. J න අරා නොව විරල අරා වලට වඩා ක්රම පරීක්ෂා කරන විට පමණක් වෙනස් වන සමාන JSperf සමඟ අපි මෙය පරීක්ෂා කරමු. කෙනෙකුට එය මෙතැනින් සොයාගත හැකිය .
එමනිසා, මෙම විශේෂිත භාවිත නඩුවේ කාර්ය සාධනයේ අනාගතය පවතින්නේ Array.prototype.push හි නොව Array.prototype.concat හි බව මගේ නඩුව විවේක ගනිමි.
𝗖𝗹𝗮𝗿𝗶𝗳𝗶𝗰𝗮𝘁𝗶𝗼𝗻𝘀
𝗦𝗽𝗮𝗿𝗲
අරාවෙහි සමහර සාමාජිකයන් අතුරුදහන් වූ විට. උදාහරණයක් වශයෙන්:
// This is just as an example. In actual code,
// do not mix different types like this.
var mySparseArray = [];
mySparseArray[0] = "foo";
mySparseArray[10] = undefined;
mySparseArray[11] = {};
mySparseArray[12] = 10;
mySparseArray[17] = "bar";
console.log("Length: ", mySparseArray.length);
console.log("0 in it: ", 0 in mySparseArray);
console.log("arr[0]: ", mySparseArray[0]);
console.log("10 in it: ", 10 in mySparseArray);
console.log("arr[10] ", mySparseArray[10]);
console.log("20 in it: ", 20 in mySparseArray);
console.log("arr[20]: ", mySparseArray[20]);
විකල්පයක් ලෙස, අමතර අරා පහසුවෙන් ආරම්භ කිරීමට ජාවාස්ක්රිප්ට් ඔබට ඉඩ දෙයි.
var mySparseArray = ["foo",,,,,,,,,,undefined,{},10,,,,,"bar"];
𝗔𝗿𝗿𝗮𝘆-
අරාව වැනි වස්තුවක් යනු අවම වශයෙන් length
දේපලක් ඇති නමුත් එය ආරම්භ කර new Array
හෝ නොතිබූ වස්තුවකි []
; උදාහරණයක් ලෙස, පහත දැක්වෙන වස්තූන් අරාව වැනි වර්ගීකරණය කර ඇත.
{0: "foo", 1: "bar", දිග: 2}
document.body.children
නව Uint8Array (3)
- මෙය අරා-සමාන ය, මන්ද එය (n) (ටයිප් කළ) අරාවක් වුවද, එය අරාවකට බල කිරීම ඉදිකිරීම්කරු වෙනස් කරයි.
(ශ්රිතය () {ආපසු තර්ක}) ()
පෙත්තක් වැනි අරා වලට අරාව-කැමැත්ත බල කරන ක්රමයක් භාවිතා කරමින් සිදුවන්නේ කුමක්ද යන්න නිරීක්ෂණය කරන්න.
var slice = Array.prototype.slice;
// For arrays:
console.log(slice.call(["not an array-like, rather a real array"]));
// For array-likes:
console.log(slice.call({0: "foo", 1: "bar", length:2}));
console.log(slice.call(document.body.children));
console.log(slice.call(new Uint8Array(3)));
console.log(slice.call( function(){return arguments}() ));
- සටහන: ක්රියාකාරීත්වය නිසා ශ්රිත තර්ක මත පෙත්තක් කැඳවීම නරක පුරුද්දකි.
කරන්නේ බව ක්රමය භාවිතා සිදු වන දෙය නිරීක්ෂණය නොවන concat වැනි පෙලගැස්මක් බවට බිය වද්දන මාලාවක්-කැමතියි.
var empty = [];
// For arrays:
console.log(empty.concat(["not an array-like, rather a real array"]));
// For array-likes:
console.log(empty.concat({0: "foo", 1: "bar", length:2}));
console.log(empty.concat(document.body.children));
console.log(empty.concat(new Uint8Array(3)));
console.log(empty.concat( function(){return arguments}() ));