ස්වදේශික ES6 පොරොන්දු බ්ලූබර්ඩ් වලට වඩා මන්දගාමී හා මතක ශක්තියෙන් යුක්ත වන්නේ ඇයි?


198

දී මෙම මිණුම් ලකුණක් , මෙම පෙලේ bluebird පොරොන්දු සාපේක්ෂව ES6 පොරොන්දු හා බොහෝ මතකය ලෙස භාවිතා 3.6 ගුණයක් සම්පූර්ණ කිරීම සඳහා තවදුරටත් 4 වතාවක් ගනී.

C හි ලියා ඇති v8 හි ස්වදේශීය ක්‍රියාත්මක කිරීමට වඩා ජාවාස්ක්‍රිප්ට් පුස්තකාලයක් එතරම් වේගවත් හා සැහැල්ලු වන්නේ කෙසේද? බ්ලූබර්ඩ් පොරොන්දු වල ස්වදේශීය ඊඑස් 6 පොරොන්දු වලට සමාන API ඇත (අතිරේක උපයෝගීතා ක්‍රම රාශියක්).

ස්වදේශීය ක්‍රියාත්මක කිරීම නරක ලෙස ලියා තිබේද, නැතහොත් මට මග හැරී ඇති වෙනත් අංගයක් තිබේද?


නවීන ජාවාස්ක්‍රිප්ට් ක්‍රියාත්මක කිරීම බෙහෙවින් ප්‍රශස්තිකරණය කර ඇති බව මතක තබා ගන්න, එය දේශීයව JIT භාවිතයෙන් පවා ක්‍රියාත්මක විය හැකිය .

1
මෙම මිණුම් දණ්ඩට අනුව , බ්ලූබර්ඩ් ජේඑස් ඇත්ත වශයෙන්ම ස්වදේශීය පොරොන්දු වලට වඩා මන්දගාමී ය. නමුත්, PromiseMeSpeedJS ඇත්ත වශයෙන්ම ඒ දෙකම අභිබවා යයි. PromiseMeSpeedJS මෙයින් සනාථ කරන බොහෝ දේවලින් එකක් නම් පොරොන්දු සඳහා ප්‍රධාන කාර්ය සාධන වැරදිකරුවෙකු වන්නේ පොරොන්දුවේ අනිසි ලෙස භාවිතා කිරීම newක්‍රියාකරු අනිසි ලෙස භාවිතා කිරීමයි new.
ජැක් ගිෆින්

1
Ack ජැක්ගිෆින් ක්‍රෝම් 67: ප්‍රොමිස්මීස්පීඩ්ජේඑස් 46% මන්දගාමී වන අතර බ්ලූබර්ඩ් 61% මන්දගාමී වේ.
FINDarkside

Answers:


274

බ්ලූබර්ඩ් කතුවරයා මෙහි.

V8 පොරොන්දු ලෙස ක්‍රියාත්මක කිරීම ලියා ඇත්තේ ජාවාස්ක්‍රිප්ට් වලින් නොවේ. සී. දේශීය කේතයට සම්පාදනය කිරීමට පෙර පරිශීලක ලිඛිත ජාවාස්ක්‍රිප්ට් හැකි නම් (සහ එය වටිනවා) ප්‍රශස්තිකරණය කර ඇත. ක්‍රියාවට නැංවීම පොරොන්දු වන්නේ සී හෝ ලිවීමෙන් බොහෝ සෙයින් ප්‍රයෝජන නොලබන දෙයක් වන අතර ඇත්ත වශයෙන්ම එය මන්දගාමී වනු ඇත්තේ ඔබ කරන්නේ ජාවාස්ක්‍රිප්ට් වස්තු සහ සන්නිවේදනය හැසිරවීම නිසාය.

V8 ක්‍රියාත්මක කිරීම හුදෙක් බ්ලූබර්ඩ් තරම් ප්‍රශස්ත නොවේ, එය අවස්ථා වලදී පොරොන්දු හසුරුවන්නන් සඳහා අරා වෙන් කරයි. සෑම පොරොන්දුවක්ම අරා කිහිපයක් වෙන් කළ යුතු විට මෙය විශාල මතකයක් අවශ්‍ය වේ (මිණුම් ලකුණ සමස්ත 80k පොරොන්දු නිර්මාණය කරයි, එමඟින් 160k භාවිතයට නොගත් අරා වෙන් කර ඇත). යථාර්ථය නම්, භාවිත අවස්ථා වලින් 99.99% ක්ම එක වරකට වඩා පොරොන්දුවක් නොදෙන අතර මෙම පොදු අවස්ථාව සඳහා ප්‍රශස්තිකරණය කිරීමෙන් විශාල මතක භාවිතය වැඩි දියුණු වේ.

V8 බ්ලූබර්ඩ් මෙන් ප්‍රශස්තිකරණයන් ක්‍රියාත්මක කළද, පිරිවිතරයන්ට එය තවමත් බාධාවක් වනු ඇත. new PromiseES6 හි මූල පොරොන්දුවක් නිර්මාණය කිරීමට වෙනත් ක්‍රමයක් නොමැති බැවින් මිණුම් ලකුණ භාවිතා කළ යුතුය (බ්ලූබර්ඩ්හි ප්‍රති-රටාවක්). new Promiseපොරොන්දුවක් නිර්මාණය කිරීමේ අතිශය මන්දගාමී ක්‍රමයකි, පළමුව ක්‍රියාත්මක කරන්නාගේ ශ්‍රිතය වැසීමක් වෙන් කරයි, දෙවනුව එය වෙනම වසා දැමීම් 2 ක් තර්ක ලෙස සම්මත කරයි. එය පොරොන්දුවක් සඳහා වෙන් කිරීම් 3 ක් වෙන් කර ඇති නමුත් වසා දැමීම දැනටමත් ප්‍රශස්ත පොරොන්දුවකට වඩා මිල අධික වස්තුවකි.

බ්ලූබර්ඩ් භාවිතා promisifyකළ හැකි අතර එය බොහෝ ප්‍රශස්තිකරණයන් සක්‍රීය කරන අතර ඇමතුම් ආපසු ලබා ගැනීමේ ඒපීඅයි පරිභෝජනය කිරීමේ වඩාත් පහසු ක්‍රමයක් වන අතර එය සම්පූර්ණ මොඩියුලයන් එක පේළියක ( promisifyAll(require('redis'));) පොරොන්දු පදනම් කරගත් මොඩියුල බවට පරිවර්තනය කිරීමට ඉඩ සලසයි .


11
"පිරිවිතරයන්ට තවමත් බාධා කරන්න" - එහි තේරුම කුමක්දැයි විශ්වාස නැත. ES6 සහජයෙන්ම මන්දගාමී වන පිරිවිතරයක් අනුගමනය කරන බව ඔබ පවසනවාද, එය එසේ නම්, එයින් අදහස් කරන්නේ බ්ලූබර්ඩ් එකම පිරිවිතරයක් අනුගමනය නොකරන බවයි (සහ එය එසේ නම්, එය වෙනත් එකක් අනුගමනය කරන්නේද, කුමන එකද)? ES6 ට වඩා හොඳ මූල පොරොන්දුවක් නිර්මාණය කිරීමට වඩා හොඳ ක්‍රමයක් නොතිබීමට new Promiseහෝ එය අඩු වියදම් බවට පත් කිරීම සඳහා ක්ෂණිකකරණය වැඩිදියුණු කිරීමට කිසියම් හේතුවක් තිබේද (උදාහරණයක් ලෙස වසා දැමීම් 3 ක් නිර්මාණය නොකිරීම වැනි)?
ඇන්තනි

12
එය කිසිසේත්ම හොඳ නැත (JS සඳහා). අභ්‍යන්තර ක්‍රියාත්මක කිරීමක් ඇති විට මට පොරොන්දු පුස්තකාලයක් භාවිතා කිරීමට අවශ්‍ය නැත. මේ සියල්ල සත්‍ය නම් මෙය සෑම කෙනෙකුටම අවාසනාවන්ත තත්වයකට වඩා වැඩි ය. නමුත් මම දැනටමත් කරදර පොරොන්දුව-අතිශයෝක්තියෙන් දුටු කෙසේ හෝ, මම ලියා තිබෙනවා ඇති 100,000 LOC JS යෙදුම් සහ මේ සඳහා කිසිදු සැබෑ අවශ්යතාවක් මට තවමත් බලන්න එපා, එය ඉතා සුළු වැඩි දියුණු කිරීම සියලු දී නම් තියෙන්නේ මට , බොහෝ විට වැරදි මෙහෙයුම්, නැත, කිසිම ඇමතුම් ආපසු හැසිරවීමේ වැඩි දියුණු කිරීම (මගේ කේතීකරණ විලාසය සමඟ මම කිසි විටෙකත් "ඇමතුම් ආපසු නිරයේ" නොසිටියේය).
මරේ

19
ES6 හි, ඔබට Promise.resolve()"මූල පොරොන්දුවක්" නිර්මාණය කිරීමට භාවිතා කළ නොහැකිද?
zetlen

10
@ MörreNoseshine (න්) වසර ගණනාවකට පසු, ES6 කතුවරුන් පැමිණ “හේයි, JS එන්ජින් විසින් පොදු පොරොන්දු / A + අනුකූල උපයෝගීතාවයෙන් පිටතදී ලබා දිය යුතු බව සඳහන් කරමු, එබැවින් මිනිසුන්ට සෑම විටම මූලික පොරොන්දු මෙවලමක් තිබේ ". මෙය කදිම පහසුවකි (ඉක්මන් Promise.resolve()හෝ ඕනෑම දෙයක් කිරීමට පුස්තකාලයක් ආනයනය නොකිරීම ), නමුත් එය ඉතා මූලික ක්‍රියාත්මක කිරීමක් වන අතර එහි පැවැත්ම බ්ලූබර්ඩ් වැනි වඩා බැරෑරුම් පොරොන්දු ආශ්‍රිත මෙවලම් භාවිතා කිරීමෙන් ඔබව වළක්වා නොගත යුතුය!
callum

11
@ MrerreNoseshine 100k LOC Javascript යෙදුම කිසි විටෙකත් අසමමුහුර්ත ක්‍රියාකාරිත්වයක් නොතිබුණි. බ්ලූබර්ඩ් නොමැතිව mysql / redis පුස්තකාලයක් සහිත 100k LoC JS ක්‍රීඩාවක් ලිවීමට වාසනාව.
NiCk Newman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.