بهینه سازی های فوق العاده در زبان برنامه نویسی جاوا اسکریپت

سه شنبه 12 آذر 1398

شما انجام برخی از اقدامات می توانید اقدام به بهینه سازی برنامه های جاوا اسکریپت کنید، ما در این مطلب درباره بهینه سازی کدهای جاوا اسکریپت صحبت خواهیم کرد.

 بهینه سازی های فوق العاده در زبان برنامه نویسی جاوا اسکریپت

امروزه یک پدیده بسیار عجیب و غریب در دنیای جاوا اسکریپت وجود دارد. با وجود اینکه زبان برنامه نویسی جاوا اسکریپت در طی دهه گذشته تقریبا بدون تغییر باقی مانده است اما تحولی در بین توسعه دهندگان آن به وجود آمده است. آنها دقیقا از همین زبانی استفاده می کنند که ما با استفاده از آن برنامه های نسبتا سنگین سمت کلاینت را می نویسیم. اگر چه ممکن است به نظر برسد که ما در یک مسابقه فرمول یک شرکت کرده ایم اما واقعیت آن است که ما در دهه گذشته صرفا مشغول به رانندگی در یک جاده بوده ایم. ما هرگز از این زبان به صورت کامل استفاده نکرده ایم. مدت ها طول کشید تا ما متوجه این اشتباه خود شویم اما نکته ای که وجود دارد این است که در حال حاضر در مسیر خود هستیم.

مقدمه ای درباره این موضوع

مسئله این است که شما می توانید خیلی سریع سرعت خود را به 60 مایل در ساعت برسانید اما اگر قصد دارید که چرخ دنده های شما سالم بمانند باید دنده ها را تغییر دهید. نکته اصلی برای نوشتن برنامه های مختلف با زبان برنامه نویسی جاوا اسکریپت نیز همین است. پردازنده های سریع این تصور را به ما می دهند که می توانیم برنامه هایی بنویسیم که خیلی سریع کار کنند، این موضوع شاید در برنامه های کوچک صدق کند ولی در صورتی که پروژه های بزرگ را با جاوا اسکریپت پیاده سازی کنید ممکن است شرایط به شکلی تغییر پیدا کند که سرعت برنامه شما بسیار کم و به اصطلاح لاک پشتی شود. بنابراین دقیقا مانند یک راننده معمولی که برای ورود به مسابقه نیاز به آموزش دارد اگر بخواهیم آن را در برنامه های بزرگ پیاده سازی کنیم باید مهارت های لازم را در زبان برنامه نویسی جاوا اسکریپت بدست آوریم.

 جاوا اسکریپت


متغیرها در زبان جاوا اسکریپت

اجازه دهید به یکی از اصول اولیه برنامه نویسی یعنی متغیرها نگاهی داشته باشیم. برخی از زبان های برنامه نویسی نیاز دارند تا شما قبل از استفاده از یک متغیر آن را تعریف کنید اما جاوا اسکریپت به این کار نیازی ندارد. البته توجه داشته باشید که این موضوع که نیازی ندارد دلیل نمی شود تا شما این کار را انجام ندهید. دلیل این موضوع این است که در این زبان برنامه نویسی اگر شما یک متغیر را به صورت مستقیم با استفاده از کلمه کلیدی var تعریف نکنید زبان جاوا اسکریپت متغیر را به صورت گلوبال در نظر می گیرد و باید بدانید که متغیرهای گلوبال بسیار کند هستند، چرا؟ به این دلیل که تفسیر کننده نیاز دارد تا بفهمد که متغیری که الان مورد نیاز است کجا تعریف شده است بنابراین برای جستجوی آن به زمان نیاز دارد. مثال زیر را در نظر بگیرید:

function doSomething(val) {

    count += val;

};

آیا متغیر count دارای مقداری در خارج از محدوده ای که از آن استفاده شده است می باشد؟ یا اینکه این متغیر فقط به درستی تعریف نشده است؟ علاوه بر این در یک برنامه بزرگ داشتن چنین متغیرهای گلوبال و عمومی باعث بوجود آمدن مشکلات زیادی می شود.

 جاوا اسکریپت


حلقه ها در جاوا اسکریپت ( بخش اول)

جستجو در محدوده برنامه برای پیدا کردن اینکه متغیر count در مثال قبلی دقیقا در کجا تعریف شده است اگر این اتفاق تنها یک بار بیفتد خیلی مهم نیست. اما در اپلیکیشن های تحت وب در مقیاس بزرگ این موضوع فقط یک بار اتفاق نمی افتد، به ویژه در حلقه ها. اولین نکته ای که باید درباره حلقه ها به خاطر داشته باشید و البته این موضوع تنها محدود به زبان برنامه نویسی java script نیست این است که سعی کنید بیشتر کارها را تا جای ممکن در خارج از حلقه انجام دهید. هر چه حلقه شما کار کمتری را انجام دهد حلقه شما سریعتر به اتمام می رسد. اجازه دهید مثالی که در ادامه می آوریم را مشاهده کنیم و نکاتی را درباره آن به شما ارائه دهیم.

 جاوا اسکریپت


حلقه ها( بخش دوم)

مثال زیر را در نظر بگیرید:

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 درصد سریعتر از حلقه ای که بالاتر دیدیم اجرا شود چرا که در هر بار تکرار مقدار یک را به سادگی از i کم می کند و از آنجایی که این مقدار نمی تواند غیر واقعی باشد و در واقع نمی تواند صفر باشد حلقه ادامه پیدا می کند تا به مقدار صفر برسد و زمانی که به آن رسید حلقه متوقف می شود. علاوه بر این شما می توانید سایر انواع حلقه ها را نیز مانند مثال زیر داشته باشید:

while (i--) {

    // some code here

}

دوباره باید بیان کنیم که از آنجایی که بررسی و تفریق عدد یک از i در همان زمان انجام می شود تمام نیاز حلقه while این است که متغیر i به مقدار صفر برسد تا از حلقه خارج شود.

 جاوا اسکریپت


کش کردن در جاوا اسکریپت( بخش اول)

زمانی که ما طول آرایه arr را در یک حافظه کش ذخیره کردیم در واقع به این نوع حافظه اشاره ای داشتیم. شما می توانید همین اصل را در بسیاری از موارد دیگر نیز در جاوا اسکریپت به کار ببرید. اساسا هدف از انجام این کار این است که ما می خواهیم با این کار از ارسال مفسر برای انجام کارهای غیر ضروری اجتناب کنیم و مفسر را وادار کنیم که تنها یک بار هر کاری را انجام دهد. به عنوان مثال زمانی که مفسر به آنجا می رسد که به دنبال محل تعریف متغیر گلوبال ما باشد، حافظه کش به صورت محلی این مقدار را به مفسر می دهد و باعث می شود تا مفسر دوباره به دنبال محل تعریف متغیر ما نباشد. اجازه دهید این موضوع را در بخش بعدی با مثال توضیح دهم.

 جاوا اسکریپت


کش کردن در جاوا اسکریپت( بخش دوم)

مثال زیر را در نظر بگیرید:

var aGlobalVar = 1;


function doSomething(val) {

    var i = 1000, agv = aGlobalVar;

    while (i--) {

        agv += val;

    };

    aGlobalVar = agv;

};


doSomething(10)
;

در این مثال aGlobalVar هزار بار دریافت نشده است و تنها دوباره دریافت شده است. ما اولین بار آن را برای گرفتن مقدار دریافت کرده ایم و برای بار دوم نیز آن را دریافت کرده ایم تا مقدار جدیدی را به آن بدهیم. اگر ما از آن در داخل یک حلقه while استفاده کنیم مفسر ما احتمالا مجبور می شود که برای هزار بار آن را دریافت کند. در حقیقت حلقه بالا مدت زمان 3 میلی ثانیه طول می کشد تا قطعه کد بالا را با تغییر avg += val; با aGlobalVar += val; اجرا کند.

 جاوا اسکریپت


ویژگی های عمیق تر

اشیا تودرتو در کنار استفاده از سیمبل دات(.) یک روش عالی برای سازماندهی کردن کدهای شما است. متاسفانه وقتی صحبت از عملکرد می شود این کار کمی مشکل ساز می شود. هر بار که شما در این سناریو به یک مقدار دسترسی پیدا می کنید مفسر زبان باید تمامی مقادیر تودرتویی که برای دسترسی به آن مقدار نیاز است را بپیماید و بنابراین زمان برنامه شما طولانی تر خواهد شد. بنابراین حتی در صورتی که قابلیت namespacing یک ابزار سازماندهی فوق العاده باشد نگه داشتن اشیا تا جای ممکن در عمق کمتر می تواند باعث عملکرد سریعتر برنامه شما شود.

 جاوا اسکریپت


خلاصه و نتیجه گیری

این موارد تنها چند مثال بودند که چگونه می توانید باعث بهبود عملکرد اپلیکیشن جاوا اسکریپت خود شوید. به خاطر داشته باشید که مرورگرها به صورت دائمی در حال تکامل هستند. به عنوان مثال مرورگرهای امروزی برای بهبود دادن عملکرد برنامه ها کامپایلرهای JIT را معرفی کرده اند. اما این موضوع به آن معنا نیست که ما می توانیم در برنامه نویسی هوشیاری کمتری را داشته باشیم.

ایمان مدائنی

نویسنده 1299 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید