Advertisement
Advertisement

More Related Content

Advertisement

Javascript Performance Optimisation

  1. Web'in öksüz evladı: JavaScript JavaScript Web tarihi boyunca çok az insanın önemsediği, çok güçlü, prototype tabanlı, Object-Orient bir dildir. Sunumun amacı: JavaScript Performans Optimizasyonu İrfan Durmuş
  2. Kısaca..
  3. Geleceğin Teknolojisi:
  4. Nerelerde JS kullanılıyor?
  5. Nonblocking pattern:
  6. Optimizasyon da ilk adım
  7. Global variables suck!:
  8. Global yerine local daha iyi bir seçim
  9. DOM'a erişimin maaliyeti:
  10. Git gel Gecko 6 saat
  11. Event binding:
  12. Tek binding ile toplu event handle etmek varken..
  13. Döngü içindeki değişkenler:
  14. Aynı değeri defalarca istemek gereksiz
  15. Web'in öksüz evladı: JavaScript JavaScript Tarihi Kısaca..
  16. İlk kez 1995'de Netscape ile dağıtıldı.
  17. Mocha -> LiveScript -> JavaScript
  18. 1996 Kasım'da standartlaştırma için Ecma International'a gönderildi.
  19. Web'in öksüz evladı: JavaScript Geleceğin Teknolojisi JavaScript Nerelerde Kullanılıyor?
  20. PDF Dosyaları
  21. SSB: Site Specific Browsers
  22. Gmail, Twitter, Facebook masaüstü uygulamaları.
  23. Mobil Uygulamalar, Masaüstü Widget'lar
  24. PhoneGap, JSCocoa, Apple Widgets, Microsoft Gadgets
  25. Tarayıcı eklentileri, Masaüstü uygulamaları
  26. Opera, Chrome Eklentileri, Firebug, Chrome Webstore
  27. Nodejs/V8, mod_js/SpiderMonkey
  28. Onlarca CommonJS implementasyonu çözümü
  29. CommonJS ile;
  30. Sunucu tarafında JavaScript Uygulamaları (CouchDB)
  31. Komut satırı uygulamaları (NodeJS)
  32. Desktop/GUI Uygulamaları (Widget'lar)
  33. Hibrid uygulamalar (Adobe Air)
  34. Herşey birer object'dir, yeni bir object için 'class' yerine 'function' kullanırız.
  35. Anonymous function, isimsiz bir scope'dur. Aşağıdaki şekilde yazılır ve parametre gönderilir. Tabii ki bu da objectdir.
  36. (function($, window){
  37. // code...
  38. }(jQuery, wndow));
  39. Prototype tabanlı bir dildir, her objenin bir prototype'ı vardır. Prototype'daki bir değişkene erişirken, 'prototype'sız kullanılır. Aşağıdaki örneği inceleyelim;
  40. function Users(){};
  41. Users.prototype.getUser = function(id){ return id;};
  42. var id = 1,
  43. user = new Users();
  44. user.getUser(id);
  45. Web'in öksüz evladı: JavaScript Nonblocking Pattern Optimizasyonda İlk Adım
  46. Script dosyaları yüklendikten sonra derlenme süreci vardır.
  47. Derlenme sürecinde bir sonraki script dosyası da diğer tüm içerik gibi bekletilir.
  48. Inline JavaScript satırları da yorumlanması için JS Engin'e gönderildiğinde diğer tüm içerik bekletilir.
  49. Nonblocking pattern, diğer içeriği engellemeden JavaScript çalıştırmayı amaçlar.
  50. Nonblocking Pattern Script elementlerinin olduğu bir sayfanın yüklenişi.. milisaniye main.js shared.js users.js other.js style.css Yükleme süresi Çalıştırma süresi
  51. Nonblocking Pattern Script tag'leri nerede konumlanmalıdır? … .. <head> <meta http-equiv=&quot;Content-type&quot; content=&quot;text/html; charset=utf-8&quot;> </head> <body> … .. … .. <script src=&quot;js/main.js&quot;></script> </body> </html>
  52. HTML 4, eski bir teknik ve çoğu taraycı desteklemediği için bahsetmeyeceğiz.
  53. Dinamik Script Elementi
  54. var script = document.createElement('script'); script.src=”bar.js”;
  55. document.getElementsByTagName('head')[0].appendChild(script);
  56. AJAX ile Script Injection
  57. XMLHttpRequest aracılığıyla js dosyası alınır ve body e append edilir.
  58. var x = new XMLHttpRequest();
  59. x.open('get', 'main.js', true);
  60. x.onreadystatechange = function(){
  61. //.. xhr kontrol ve append kodları burada..
  62. };
  63. loader.js ve main.js
  64. Minimizer ve Obfuscator kullanın.
  65. Google closure veya YUI
  66. Script taglarını </body> den hemen önce yerleştirin.
  67. var script = document.createElement('script'); script.src=”bar.js”;
  68. document.getElementsByTagName('head')[0].appendChild(script);
  69. Sayfadaki tüm argumanların tamamlanmasını bekleyin.
  70. Jquery'deki document.ready nin sırrı..
  71. Script tag'ini dinamik oluşturun.
  72. loader.js nin görevi: document.createElement('script');
  73. github.com/rgrove/lazyload
  74. YUI (Yahoo User Interfaces)
  75. http://developer.yahoo.com/yui/
  76. Kendi yazacağınız, 20 satır civarında bir loader.
  77. Script tag'i event leri ile script dosyasının yüklenip hazır olduğunu anlayabiliyoruz. Hiç bir script dosyası sayfa tamamen hazır olmadan yüklenmemeli ve çalıştırılmamalı. obj.readyState (ie) ve/ya obj.onLoad (diğerleri) eventleri beklenmeli. Bu loader, dinamik olarak oluşturacağı script objesine src olarak yüklemek istediğiniz dosya yolunu verdikten sonra sayfaya append etmeli.
  78. Web'in öksüz evladı: JavaScript Global Variables Suck! Global yerine local çok daha iyi bir seçim.
  79. Global Variables Suck İçiçe property'leri olan globaldeki bir objenin propertylerine erişmek; var obj = {}; obj.smth = {}; obj.smth.more = {}; obj.smth.more.first = 2; obj.smth.more.second = 3; obj.smth.more.data; function sum_nested_vars(){ for(var i = 0; i < 200000; i++){ obj.smth.more.data = obj.smth.more.first + obj.smth.more.second; } return obj.smth.more.data; } sum_nested_vars();
  80. Global Variables Suck Global değişkenlere/methodlara erişmek var first = 2, second = 3; function sum_global_vars(){ var data; for(var i = 0; i < 200000; i++){ data = first + second; } return data; } sum_global_vars();
  81. Global Variables Suck Local değişkenler kullanmak function sum_local_vars(){ var first = 2, second = 3, data; for(var i = 0; i < 200000; i++){ data = first + second; } return data; } sum_local_vars();
  82. Global Variables Suck GLOBAL AS NESTED 430 milisaniye GLOBAL DEĞİŞKEN 300 milisaniye LOCAL DEĞİŞKEN 1 milisaniye
  83. Global Variables Suck // … function sum_nested_vars(){ var first = obj.smth.more.first, second = obj.smth.more.second, data = obj.smth.more.data; for(var i = 0; i < 200000; i++){ data = first + second; } obj.smth.more.data = data; return data; } // ... // ... function sum_nested_vars(){ for(var i = 0; i < 200000; i++){ obj.smth.more.data = obj.smth.more.first + obj.smth.more.second; } return obj.smth.more.data; } // ... Nested global objeden local değişkene optimizasyon. Uygulamanın büyüklüğüne göre bu farkın çok açılacağını veya kapanacağını unutmayın! 430 milisaniye 1 milisaniye
  84. Web'in öksüz evladı: JavaScript DOM'a Erişimin Maaliyeti Git gel Gecko altı saat.
  85. DOM'a Erişimin Maliyeti function innerHtmlBadWay(){ for (var i = 0; i < 10000; i++){ document.getElementById('myDiv').innerHTML += 'x'; } } innerHtmlBadWay(); Her bir işlem için layout engine'e erişmektense, tüm datayı bir variable içerisinde toplayıp tek seferde yazmak çok daha hızlıdır. function innerHtmlGoodWay(){ var data = 'x'; for (var i = 0; i < 10000; i++){ data += 'x'; } document.getElementById('myDiv').innerHTML += data; } innerHtmlGoodWay(); X √
  86. DOM'a Erişimin Maliyeti 10.000 kez DOM'a innerHTML ile erişmek yerine datayı değişkene atayıp bir kez layout engine gitmek arasındaki farkı gösteren grafik. For içinde erişmek: 3050 milisaniye Variable'a atamak: 1 milisaniye
  87. DOM'a Erişimin Maliyeti Request document.getElementByID('mydiv'); Response <div id='mydiv'></div> 6 saat'lik mesafe NEDEN?
  88. Web'in öksüz evladı: JavaScript Event Binding Tek binding ile toplu event handle etmek varken..
  89. Event Binding Event'ler, click, hover, focus, keypress, mouseover vb. DOM eventleri olabileceği gibi, developer tarafından tanımlanmış özel eventler da olabilir. Event nedir?
  90. Event Binding document.addEventListener('click', function(){ // code... }); veya function foo(){ // code... }; document.addEventListener('click', foo); Event listener
  91. Event Binding Bir event'in işleyişi <div id=”container”> <ul id=”navigation”> <a href=”/main”>Home</a> <li> event
  92. Event Binding Bir event'in işleyişi Event, window objesine kadar parent'ler üzerinden ilerler. <div id=”container”> <ul id=”navigation”> <a href=”/main”>Home</a> <li> Event objedir ve target property'si vardır. Target property'si tıklanan DOM elementinin referansıdır, ve değişmez. event event
  93. Event Binding <ul id=”navigation”> <li><a href=”/main”>Home</a></li> <li> <a href=”/foo”>Foo</a> </li> <li><a href=”/bar”>Bar</a></li> <li><a href=”/baz”>Baz</a></li> <li><a href=”/about”>About</a></li> </ul> Event objesi parent'ler üzerinden ilerlediğine göre, her bir link için ayrı ayrı event atamak yerine, liste içerisindeki tüm eventleri burada yakalayabiliriz. event
  94. Event Binding (function() { document.getElementById('navigation').onclick = function(event){ var target = event.target; if (event.target.tagName == 'A') { alert('Şu sayfa açılacak: ' + target.attributes[0].value); document.location = target.attributes[0].value; }; event.preventDefault(); event.stopPropagation(); } }());
  95. Web'in öksüz evladı: JavaScript Döngü İçindeki Değişkenler Aynı değeri defalarca istemek gereksiz
  96. Döngü İçindeki Değişkenler for (var i=0; i < things.length; i++) { typeof things[i]; }; var l = things.length; for (var i=0; i < l; i++) { typeof things[i]; }; iyi daha iyi var l = things.length i=0; for (; i < l; i++) { typeof things[i]; }; kötü
  97. Döngü İçindeki Değişkenler 55.000 elemanı olan bir array için grafikteki performans farkı gözlenmiştir.
  98. Okunabilecek Kitaplar
  99. Ek: Kaynaklar: - Wikipedia - Nicholas C. Zakas: High Performance JavaScript İndirilebilir sunum: slideshare.net/irfandurmus/javascript-performance-optimisation Sunumdaki Kodlar: github.com/irfan/javascript-presentation-codes
  100. Web'in öksüz evladı: JavaScript SORULAR İrfan Durmuş
Advertisement