Пераклад на беларускую мову Patricia Clausnitzer
JavaScript -- прыкметная з'ява ў сённяшнім свеце. Хоць мова застаецца адносна нязменным на працягу апошняга дзесяцігоддзя, эвалюцыя назіраецца сярод праграмістаў. Яны выкарыстоўваюць той жа мова, які выводзіўся ў выглядзе тэксту ў радку стану для таго, каб напісаць некалькі даволі цяжкіх кліенцкіх прыкладанняў. Хоць можа здацца, што мы ўваходзім гонкі Лада ці F1, у рэчаіснасці мы выдаткавалі апошнія дзесяць гадоў кіравання на гоначным аўтамабілі F1 узад і наперад па дарозе. Мы ніколі не выкарыстоўвалі з дапамогай мовы ўвесь яго патэнцыял. Ён адкрыў Ajax для запуску нас з пад'езда па гоначнай трасе. Але зараз, калі мы знаходзімся на трэку, там ёсць чырвоная рыса і чутны скрыгат. Не вельмі шмат людзей, здаецца, ведаюць, як кіраваць балідам F1. Прынамсі, на хуткасці 250 міль / ч.
Даволі лёгка пакласці ногі на падлогу і атрымаць да 60 міль / ч. Але вельмі хутка вам прыйдзецца змяніць тактыку, калі вы жадаеце пазбегнуць прыпынкі. Тое ж самае ідзе з напісаннем вялікіх прыкладанняў на боку кліента ў JavaScript. Хуткадзейныя працэсары ствараюць уражанне, што мы можам зрабіць што-небудзь з ім. А для невялікіх праграм гэта праўда. Але калі пісаць шмат дрэннага JavaScript-кода, можна вельмі хутка прыйсці да сітуацыі, калі ваш код пачне "паўзці". Мы павінны асвоіць усе тонкасці гэтай мовы, калі мы жадаем утрымоўваць яго бесперабойным у буйных маштабах.
Зменныя
Давайце зірнём на адзін з граняў праграмавання - на зменныя. Некаторыя мовы патрабуюць аб'явы зменных перад іх выкарыстаннем, а JavaScript - не. Але толькі таму, што гэта не патрабуецца, што не азначае, што вы не павінны рабіць гэта. Гэта таму, што ў JavaScript, калі зменная не абвешчана відавочна з дапамогай VAR па ключавым слове, гэта разглядаецца як глабальны характар, і глабальныя. Чаму? Таму што перакладніку неабходна высвятліць, калі і калі зменная пытанне была першапачаткова абвешчана, таму ён ідзе да пошуку. Разгледзім наступны прыклад.
function doSomething(val) {
count += val;
};
Ці мае колькасць значэнне, ускладзенае на яго ці выходзіць за рамкі чаго-небудзь? Ці гэта проста не абвешчана правільна? Акрамя таго, у вялікай праграме, маючы такія агульныя глабальныя імёны зменных, цяжка пазбегнуць сутыкненні.
Цыклы
Пошук у сферы, дзе ланцужок для падліку ў прыведзеным вышэй прыкладзе не з'яўляецца такой вялікай справай, калі гэта адбудзецца адразу. Але ў буйных вэб-прыкладаннях гэта не вельмі проста для аднаго разу. Асабліва, калі завесы турбуюць. Першае, што трэба памятаць пра завесу, і гэта не толькі для JavaScript, гэта рабіць больш працы па-за цыклам, наколькі гэта магчыма. Чым менш вы ў курсе, тым хутчэй ваш цыкл будзе працаваць. Давайце разгледзім найболей распаўсюджаную практыку ў завесе JavaScript, якой можна пазбегнуць. Зірніце на наступны прыклад і пагледзіце, калі вы можаце выявіць гэта:
for (var i = 0; i < arr.length; i++) {
// some code here
}
Вы гэта бачылі? Даўжыня масіва arr пералічваецца кожны раз, калі праходзіць цыкл. Простым рашэннем для гэтага з'яўляецца кэш даўжыні масіва, напрыклад:
for (var i = 0, len = arr.length; i < len; i++) {
// some code here
}
Такім чынам, даўжыня масіва вылічаецца толькі адзін раз, і цыкл ставіцца да кэшаванага значэнне кожных разоў, калі адбываецца ітэрацыя.
Так што ж мы можам зрабіць для падвышэння прадукцыйнасці нашых завес? Якія яшчэ працы праводзяцца на кожнай ітэрацыі? Мы ацэньваем значэнне i менш, чым кошт len , а таксама павялічваем i па адным. Ці можам мы паменшыць лік аперацый? Можам, калі парадак, у якім нашы цыкл выконваецца, не мае значэнні.
for (var i = 100; i--; ) {
// some code here
}
Гэты цыкл будзе выконвацца на 50% хутчэй, чым той, што вышэй, таму што на кожнай ітэрацыі яна проста адымае значэнне так, што значэнне не з'яўляецца "falsy", іншымі словамі, яно не 0, то цыкл працягваецца. У той момант, значэнне пры 0 паказаў спыніцца ў цыкле.
Вы можаце зрабіць гэта з іншымі выглядамі завес:
while (i--) {
// some code here
}
Ізноў жа, паколькі адзнака і аперацыі адымання з гэтага робіцца ў той жа час, увесь час цыклу будзе falsy ці 0, і цыкл завершыцца.
Кэшаванне
Я коратка спыніўся на кэшаванні вышэй, калі мы кэшавалі масіў даўжынёй у зменнай. Той жа прынцып можа быць ужыты ў розных месцах у кодзе JavaScript. Па сутнасці, мы не жадаем прымушаць перакладнік рабіць лішнюю працу (адзін раз ён ужо зрабіў гэта). Так, напрыклад, калі гаворка ідзе пра сканаванне сферы ланцуга, каб знайсці глабальную зменную для нас, кэшаванне гэтай спасылкі на месцы ", захаваць выманні перакладніка кожных разоў. Тут дазвольце мне праілюстраваць:
var aGlobalVar = 1;
function doSomething(val) {
var i = 1000, agv = aGlobalVar;
while (i--) {
agv += val;
};
aGlobalVar = agv;
};
doSomething(10);
У гэтым прыкладзе aGlobalVar я ўзяў толькі два разу, не больш за тысячу разоў. Калі б мы выкарыстоўвалі яго падчас цыклу, перакладнік выняў бы гэту зменную тысячу разоў. Сапраўды, цыкл вышэй займае каля 3 мс, каб бегчы ў той час, калі avg += val; былі заменены aGlobalVar += val; тады цыкл зойме каля 10мс для запуску.
Глыбіня ўласнасці
Укладзеныя аб'екты, з тым каб выкарыстоўваць кропкавую натацыю - гэта выдатны спосаб для імёнаў і арганізацыі кода. Калі гаворка заходзіць пра прадукцыйнасць, гэта можа быць некаторай праблемай. Кожны раз, калі значэнне доступ у такога роды сцэнар, перакладніка прайсці аб'ектаў вы ўкладзеных для таго, каб дабрацца да гэтага значэння. Чым глыбей значэнне, тым большы абыход, тым даўжэй трэба чакаць. Так што, хоць найменне з'яўляецца вялікай арганізацыйнай прыладай, захоўванне рэчаў, як дробных магчыма гэта ваша лепшая стаўка на хуткасць працы назапашвальніка. Апошняе ўвасабленне YUI бібліятэка накіравана для таго, каб ліквідаваць цэлы пласт гнездавання найменняў. Так, напрыклад, YAHOO.util.Anim у наш час -Y.Anim .
Рэзюмэ
Гэта толькі некалькі прыкладаў таго, як палепшыць прадукцыйнасць вашага кода, надаючы ўвага таму, як інтэрпрэтатар JavaScript робіць сваю працу. Майце на ўвазе, аднак, што браўзары ўвесь час развіваюцца, нават калі мова - не. Так, напрыклад, сённяшнія браўзары ўкаранілі JIT кампілятары для паскарэння працы. Але гэта не значыць, што мы павінны быць меней пільнымі. Таму што ўрэшце, калі вэб-прыкладанне дамаглося велізарнага поспеху, трэба лічыць кожную мілісекунду.

