SlideShare a Scribd company logo
High Performance Ajax Applications Julien Lecomte http://www.julienlecomte.net/blogfiles/performance/ajax-perf.ppt http://www.slideshare.net/julien.lecomte/high-performance-ajax-applications
Part 1 Developing For High Performance
Planning and designing for high performance Plan for performance from day 1 Work closely with designers and product managers Understand design rationale Explain the tradeoffs between design and performance Offer alternatives and show what is possible (prototype) Challenge yourself to implement challenging designs (don't just say no) Help simplify the design and interaction if needed (compromise)
Engineering high performance: A few basic rules Less is more Don’t do anything unnecessary. Don’t do anything until it becomes absolutely necessary. Break the rules Make compromises and break best practices, but only as a last resort! Work on improving perceived performance Users can deal with some reasonable amount of slowness if: They are informed appropriately that an operation is pending. The user interface remains reactive at all time. Cheat whenever you can by first updating the UI and then do the work. Need to “lock” all or part of the user interface.

Recommended for you

The secret web performance metric no one is talking about
The secret web performance metric no one is talking aboutThe secret web performance metric no one is talking about
The secret web performance metric no one is talking about

As presented as JSConf Korea. https://2022.jsconf.kr/en/speakers/anna-migas Web performance and its impact on the user experience has been a huge topic over past few years. After working for over a year on a project directed towards emerging markets (namely Nigeria and Kenya), I came to realise that the popular web performance metrics are all centred around a specific type of person: someone who is used to the fast and reliable connection. In my talk I want to share my experience on how to look at the overall web performance with the new metric in mind - user’s patience. During my talk, I want to give an insight on my work with the app that is dedicated towards the users who are working with it in not-so-ideal conditions with an unreliable connection and how to guide them through this experience. I want to chat about the cases when web performance metrics as we know it will not be applicable and what can we do to ensure the user will be able to successfully navigate the app using the well designed information and some performance tricks. I will also share details about the background of users in Africa and how their perception might differ from the users we typically develop for—since these are the fastest growing markets, maybe soon this knowledge come useful to you too

webperformancejsconfkorea
Scaling SEO by Building Products - Search London Meetup Nov 17
Scaling SEO by Building Products - Search London Meetup Nov 17Scaling SEO by Building Products - Search London Meetup Nov 17
Scaling SEO by Building Products - Search London Meetup Nov 17

My talk at November 2017 Search London Meetup. Covering how we scaled organic search growth by building products together with full stack engineers & how we operate an autonomous & independent SEO team.

seotechproduct
Cómo Desarrollar Auditorías que Maximicen el éxito SEO #SEODay
Cómo Desarrollar Auditorías que Maximicen el éxito SEO #SEODayCómo Desarrollar Auditorías que Maximicen el éxito SEO #SEODay
Cómo Desarrollar Auditorías que Maximicen el éxito SEO #SEODay

En esta presentación aprenderás cómo desarrollar auditorías SEO que sean estratégicas, contextuales, segmentadas, priorizadas, accionables, iterativas e incrementales para maximizar el éxito del proceso SEO.

seosearch engine optimizationposicionamiento en buscadores
Measuring performance Test performance using a setup similar to your users’ environment Profile your code during development Automate profiling/performance testing Keep historical records of how features perform Consider keeping some (small amount of) profiling code in production
Part 2 High Performance Page Load
Yahoo!'s Exceptional Performance rules Make Fewer HTTP Requests Use a Content Delivery Network Add an Expires Header Gzip Components (including JS!) Put CSS at the Top Move Scripts to the Bottom Avoid CSS Expressions Make JavaScript and CSS External Reduce DNS Lookups Minify JavaScript Avoid Redirects Remove Duplicate Scripts Configure ETags Make Ajax Cacheable See  http://developer.yahoo.com/performance/  for more information. A web page works in 3 (sometimes imbricated) stages: load render run These rules cover  mostly  the first stage.
Asset optimization Minify CSS and JavaScript files: Use the YUI Compressor [  http://developer.yahoo.com/yui/compressor/  ] Stay away from so-called advanced compression schemes - like Packer Combine CSS and JavaScript files: At build time [  http://www.julienlecomte.net/blog/2007/09/16/  ] At run time Optimize image assets: PngCrush [  http://pmt.sourceforge.net/pngcrush/  ] PngOptimizer [  http://psydk.org/PngOptimizer.php  ] etc.

Recommended for you

Canonicalization for SEO BrightonSEO April 2023 Patrick Stox
Canonicalization for SEO BrightonSEO April 2023 Patrick StoxCanonicalization for SEO BrightonSEO April 2023 Patrick Stox
Canonicalization for SEO BrightonSEO April 2023 Patrick Stox

Canonicalization is a process that webmasters use to tell search engines which URL is the preferred version for a page that may have duplicate content across different URLs. It helps search engines understand which version of a page should be considered the original and primary version for things like search rankings. Properly implementing canonicalization can help avoid duplicate content penalties and ensure the right URL receives credit in search results.

canonicalizationseotechnical seo
Web Performance Optimization
Web Performance OptimizationWeb Performance Optimization
Web Performance Optimization

Pragathi Technical Session 'Web Performance Optimization' By, Athira Vinod Pragathi - Tech & Socio Cultural Activity Group Livares Technologies #livares #pragathi #technicalsession #technology #technicaldiscussion #WebPerformanceOptimization

livareslivares technologiesdigital marketing
Core Web Vitals - The Modern Web Experience
Core Web Vitals - The Modern Web ExperienceCore Web Vitals - The Modern Web Experience
Core Web Vitals - The Modern Web Experience

Core Web Vitals is a guidance from Google to delivering a great user experience on the web. There're three new metrics to define the website has a good experience or not. The metrics are Largest Contentful Paint, First Input Delay, and Cumulative Layout Shift.

websitecorewebvitalssearch engine optimization
Reduce unminified code size Loading and parsing HTML, CSS and JavaScript code is costly. Be concise and write less code. Make good use of JavaScript libraries. Consider splitting your large JavaScript files into smaller files (bundles) when the parsing and compilation of the script takes an excessive amount of time ( Firefox bug #313967 ) Load code (HTML, CSS and JavaScript) on demand (a.k.a “lazy loading”) See  http://ajaxpatterns.org/On-Demand_Javascript Use the YUI Loader Dojo's package system JSAN Import System
Optimize initial rendering (1/4) Miscellaneous tips... Consider rendering the first view on the server: Be aware of the added page weight You will still need to attach event handlers once the DOM is ready Close Your HTML Tags to Speed Up Parsing: Implicitly closed tags add cost to HTML parsing http://msdn2.microsoft.com/en-us/library/ms533020.aspx#Close_Your_Tags Consider flushing the apache buffer very early on: The download of external CSS files (should be at the top of the page!) may get a head start. May not influence the rendering speed however. Browsers buffer their input before displaying it. Load only essential assets / load assets on a delay or on demand Use the YUI Image Loader
Optimize initial rendering (2/4) Don’t always wait for  onload ... Most DOM operations can be accomplished before the onload event has fired. If you have control over where your code is going to be inserted in the page, write your init code in a  <script>  block located right before the closing  </body>  tag. Otherwise, use the YUI Event utility’s  onDOMReady  method: YAHOO.util.Event.onDOMReady( function  () { // Do something here... // e.g., attach event handlers. });
Optimize initial rendering (3/4) Post-load script loading A well designed site should be fully functional, even without JavaScript enabled. Therefore, you may be able to load scripts on a delay. Doing so benefits the loading of other assets (style sheets, images, etc.) Which makes your site load faster Right before the closing  </body>  tag, insert the following: <script> window.onload =  function  () { var  script = document.createElement( &quot;script&quot; ); script.src = ...; document.body.appendChild(script); }; </script>

Recommended for you

Brighton SEO 2021 - A Deep Dive into the Depths of DevTools
Brighton SEO 2021 - A Deep Dive into the Depths of DevToolsBrighton SEO 2021 - A Deep Dive into the Depths of DevTools
Brighton SEO 2021 - A Deep Dive into the Depths of DevTools

Brighton SEO 2021 - A Deep Dive into the Depths of DevTools Resources for all the code snippets and more from this talk can be found here: https://defaced.dev/talks/brightonseo-depths-of-devtools/

seomarketingbrightonseo
How to Use Search Intent to Dominate Google Discover
How to Use Search Intent to Dominate Google DiscoverHow to Use Search Intent to Dominate Google Discover
How to Use Search Intent to Dominate Google Discover

In this talk you will learn how search intent can help you benefit from the growing popularity of Google Discover. You’ll get actionable tips, a case study example and exclusive data from SEMrush.

seosearch intentsearch engine optimization
How to get more traffic with less content - BrightonSEO
How to get more traffic with less content - BrightonSEOHow to get more traffic with less content - BrightonSEO
How to get more traffic with less content - BrightonSEO

I want you to go away after this with a really clear view on why less definitely is more, what you can do to decide what actually is too much content to have on your site, and how to go about reducing the number of pages you’ve got. Ultimately, you’re here to find out how to reduce the amount of work you have to do in the long-run to get the same amount or more traffic.

Optimize initial rendering (4/4) Conditional preloading Preloading assets (JavaScript, CSS, Images, etc.) has the potential to really enhance the user experience. However, one must be smart about when the preloading takes place. Otherwise, the preloading may actually worsen the user experience... http://www.sitepoint.com/article/web-site-optimization-steps/3 Try it at  http://search.yahoo.com/
Part 3 High Performance JavaScript
Reduce the amount of symbolic look-up: The scope chain (1/2) var  g =  7 ; function  f(a) { var  v =  8 ; x = v + a + g; } f(6); parent Look-up is performed every time a variable is accessed. Variables are resolved backwards from most specific to least specific scope.
Reduce the amount of symbolic look-up: The scope chain (2/2) Therefore, declare (with the  var  keyword) and use variables in the same scope whenever possible, and avoid global variables at all costs. Never use the  with  keyword, as it prevents the compiler from generating code for fast access to local variables (traverse the object prototype chain first, and then up the scope chain, and so on) Cache the result of expensive look-ups in local variables: var  arr = ...; var  globalVar =  0 ; ( function  () { var  i; for (i =  0 ; i < arr.length; i++) { globalVar++; } })(); var  arr = ...; var  globalVar =  0 ; ( function  () { var  i, l, localVar; l = arr.length; localVar = globalVar; for (i =  0 ; i < l; i++) { localVar++; } globalVar = localVar; })(); (faster on all A-grade browsers)

Recommended for you

BrightonSEO Slides April 2023
BrightonSEO Slides April 2023BrightonSEO Slides April 2023
BrightonSEO Slides April 2023

We must have equality by now? Why unconscious bias in the agency world is holding you back. We still live in a world where your boss is more likely to be called Steve, than to be a woman. In the US, 48% of African American women report being mistaken for administrative or custodial staff, whilst in meetings women are interrupted 33 percent more often than men. Have you ever felt that your opinions and expertise are valued less that your colleagues, that you’re being talked over in meetings, or not invited to give your opinion? Sexism and discrimination has changed from being something blatant and obvious, to more of an undertone of challenge that makes life that little bit harder for certain sectors of the population. Men get more airtime in the boardroom, and women are more likely to get interrupted. It’s not always the unpleasant chauvinist who is being sexist, it can come from other women, or the man that you actually like and respect. This sort of unconscious bias leaves us experiencing self-doubt which negatively affects our performance, our confidence and chances of promotion. Yet often we can’t put our fingers on why we feel this way, because of its very nature being more discreet. Cheryl Luzet became fascinated about unconscious bias having experienced it herself running a marketing agency. From people assuming that her male staff member must be the boss, to having her opinions questioned and challenged by male clients – challenges that mysteriously disappear when a man backs them up. With real examples from agency life, Cheryl highlights the challenges that exist for anyone working in an agency, who doesn’t fit the white, male mould. This talk isn’t just for women, if you’re a man you absolutely need to attend to find out how unconscious bias has perpetuated society that we assume is now ‘equal’. Find out how you can help to support your female colleagues get an equal opportunity.

unconscious biasagency lifesexism
Organigrama del concejo municipal de sucre del estado bolivariano de miranda
Organigrama del concejo municipal de sucre del estado bolivariano de mirandaOrganigrama del concejo municipal de sucre del estado bolivariano de miranda
Organigrama del concejo municipal de sucre del estado bolivariano de miranda

El documento presenta el organigrama del Concejo Municipal de Sucre del Estado Bolivariano de Miranda. El organigrama muestra que el Concejo Municipal está compuesto por la Presidencia, Vicepresidencia, Secretaría Municipal, Comisiones Permanentes y Cronistas. La Secretaría Municipal supervisa varias oficinas como la de Atención al Ciudadano, Protocolo, Tecnología y Análisis Financieros. La Secretaría también tiene su propio organigrama interno con unidades de Archivo, Telecomunicaciones, Correspondencia y Reproducción.

E-Commerce SEO Horror Stories : How to tackle the most common issues 
at scal...
E-Commerce SEO Horror Stories : How to tackle the most common issues 
at scal...E-Commerce SEO Horror Stories : How to tackle the most common issues 
at scal...
E-Commerce SEO Horror Stories : How to tackle the most common issues 
at scal...

Learn to tackle the most common ecommerce SEO issues and opportunities before they become horror stories.

seosearch engine optimizationsearch engine optimisation
Reduce the amount of symbolic look-up: The prototype chain function  A () {} A.prototype.prop1 = ...; function  B () { this .prop2 = ...; } B.prototype =  new  A(); var  b =  new  B(); B.prototype Accessing members bound to the primary object is about 25% faster than accessing members defined anywhere in the prototype chain. The longer the traversal of the prototype chain, the slower the look-up.
Optimize object instantiation If you need to create many objects, consider adding members to the prototype instead of adding them to each individual object in the object constructor (properties are bound once, to the prototype object) This also reduces memory consumption. However, it slows down the look-up of object members. function  Foo () {...} Foo.prototype.bar =  function  () {...}; function  Foo () { this .bar =  function  () {...}; }
Don’t use  eval ! The string passed to  eval  (and its relatives, the  Function  constructor and the  setTimeout  and  setInterval  functions) needs to be compiled and interpreted. Extremely slow! Never pass a string to the  setTimeout  and  setInterval  functions. Instead, pass an anonymous function like so: setTimeout( function  () { // Code to execute on a timeout },  50 ); Never use  eval  and the  Function  constructor (except in some extremely rare cases, and only in code blocks where performance is not critical)
Optimize string concatenation On Internet Explorer (JScript), concatenating two strings causes a new string to be allocated, and the two original strings to be copied: var  s =  “xxx”  +  “yyy” ; s +=  “zzz” ; Therefore, it is much faster on Internet Explorer to append strings to an array, and then use  Array.join  (don’t use this for simple concatenations!) var  i, s =  “” ; for (i =  0 ; i <  10000 ; i++) { s +=  “x” ; } var  i, s = []; for (i =  0 ; i <  10000 ; i++) { s[i] =  “x” ; } s = s.join( “” ); Other JavaScript engines (WebKit, SpiderMonkey) have been optimized to handle string concatenations by doing a  realloc  +  memcpy  whenever possible. Use the YUI Compressor!

Recommended for you

개발자를 위한 (블로그) 글쓰기 intro
개발자를 위한 (블로그) 글쓰기 intro개발자를 위한 (블로그) 글쓰기 intro
개발자를 위한 (블로그) 글쓰기 intro

2018년 6월 24일 "백수들의 Conference"에서 발표한 개발자를 위한 (블로그) 글쓰기 intro입니다 좋은 글을 많이 보는 노하우 + 꾸준히 글을 작성하는 노하우에 대해 주로 이야기했습니다! (어떻게 글을 작성하는가는 없어요!) 피드백은 언제나 환영합니다 :)

blogpostingwriting
Real-World Performance Budgets [PerfNow 2022]
Real-World Performance Budgets [PerfNow 2022]Real-World Performance Budgets [PerfNow 2022]
Real-World Performance Budgets [PerfNow 2022]

Performance budgets have been around for more than ten years. Over those years, we’ve learned a lot about what works, what doesn’t, and what we need to improve. In this session, I revisit old assumptions about performance budgets and offers some new practices. Topics include: • Aligning budgets with user experience • Pros and cons of Core Web Vitals • Budgets for beginners

web performanceuser experiencecore web vitals
The Big SEO Migration - Learnings from a first time hiker
The Big SEO Migration - Learnings from a first time hiker The Big SEO Migration - Learnings from a first time hiker
The Big SEO Migration - Learnings from a first time hiker

In this presentation Rene will cover the highs and lows of managing a large Ecommerce website migration for the first time. Migrations can be overwhelming so in this talk Rene will cover how to tackle the SEO essentials, stakeholder and developer management as well as how to to gain key learnings. Of course, redirects, how to change the URL structure for the better and server-side rendering will all feature. This is a high level inspirational talk centered around the highs and lows of the hike to the migration finish line with hopefully some key take-aways along the way.

seomigrationbrighton seo
Optimize regular expressions Don’t use the  RegExp  constructor, unless your regular expression is assembled at runtime. Instead, use regular expression literals. Use the  test  method if all you want to do is test for a pattern (the  exec  method carries a small performance penalty) Use non-capturing groups  (?: ... ) Stick to simple patterns. If your regular expression looks like the following, reconsider... if ( /loaded|complete/ .test(document.readyState)) {...} (?:(?:)?[])*(?:(?:(?:[^()<>@,;:&quot;.00-31]+(?:(?:(?:)?[])+||(?=[&quot;()<>@,;:&quot;.]))|&quot; (?:[^amp;quot;]|.|(?:(?:)?[]))*&quot;(?:(?:)?[])*)(?:(?:(?:)?[])*(?:[^()<>@,;:&quot;.00-31 ]+(?:(?:(?:)?[])+||(?=[&quot;()<>@,;:&quot;.]))|&quot;(?:[^amp;quot;]|.|(?:(?:)?[]))*&quot;(?:(?:)?[]) *))*@(?:(?:)?[])*(?:[^()<>@,;:&quot;.00-31]+(?:(?:(?:)?[])+||(?=[&quot;()<>@,;:&quot;.]))| ([^]|.)*(?:(?:)?[])*)(?:(?:(?:)?[])*(?:[^()<>@,;:&quot;.00-31]+(?:(?:(?:)? [])+||(?=[&quot;()<>@,;:&quot;.]))|([^]|.)*(?:(?:)?[])*))*|(?:[^()<>@,;:&quot;.00- 31]+(?:(?:(?:)?[])+||(?=[&quot;()<>@,;:&quot;.]))|&quot;(?:[^amp;quot;]|.|(?:(?:)?[]))*&quot;(?:(?:)?[ ])*)*lt;(?:(?:)?[])*(?:@(?:[^()<>@,;:&quot;.00-31]+(?:(?:(?:)?[])+||(?=[&quot;()<>@,;:&quot;. ]))|([^]|.)*(?:(?:)?[])*)(?:(?:(?:)?[])*(?:[^()<>@,;:&quot;.00-31]+(?:(?:(?: )?[])+||(?=[&quot;()<>@,;:&quot;.]))|([^]|.)*(?:(?:)?[])*))*(?:,@(?:(?:)?[]))
Caching Caching can be justified by: High cost (CPU or network latency) associated with getting a value Value will be read many times And will not change often! Increases memory consumption    tradeoff Memoization: var  fn = ( function  () { var  b =  false , v; return   function  () { if  (!b) { v = ...; b =  true ; } return  v; }; })(); function  fn () { if  (!fn.b) { fn.v = ...; fn.b =  true ; } return  fn.v; } var  fn =  function  () { var  v = ...; return  (fn =  function  () { return  v; })(); }; Module pattern Store value in function object Lazy function definition
How to handle long running JavaScript processes (1/2) During long running JavaScript processes, the entire browser UI is frozen Therefore, to maintain a decent user experience, make sure that JavaScript threads never take more than ~ 300 msec (at most) to complete. You can break long running processes into smaller units of work, and chain them using  setTimeout . You can also process the data on the server. More info at  http://www.julienlecomte.net/blog/2007/10/28 Demo
How to handle long running JavaScript processes (2/2) function  doSomething (callbackFn) { // Initialize a few things here... ( function  () { // Do a little bit of work here... if  ( termination condition ) { // We are done callbackFn(); }  else  { // Process next chunk setTimeout(arguments.callee, 0); } })(); }

Recommended for you

Hannah Rogers - Facing Your SEO Fears: Forecasting
Hannah Rogers - Facing Your SEO Fears: ForecastingHannah Rogers - Facing Your SEO Fears: Forecasting
Hannah Rogers - Facing Your SEO Fears: Forecasting

A run through of the importance of accountability in SEO forecasting, an example of how to incorporate this into your processes and how it can help your work in the long term

seoforecastmarketing
No More "It Depends" - Learn to Set your Visual SEO Resources #LondonSEOMeetu...
No More "It Depends" - Learn to Set your Visual SEO Resources #LondonSEOMeetu...No More "It Depends" - Learn to Set your Visual SEO Resources #LondonSEOMeetu...
No More "It Depends" - Learn to Set your Visual SEO Resources #LondonSEOMeetu...

This document discusses how SEOs often answer questions with the vague response of "it depends" and provides better alternatives. It recommends developing reusable resources like diagrams, charts and frameworks to more clearly explain SEO scenarios, processes and criteria. This helps avoid vague answers, establish trust, and facilitate decision making. It also encourages analyzing activities and setting replicable systems to improve services and grow expertise.

seomarketingsearch engine optimization
Phyche
PhychePhyche
Phyche

This document outlines a new way to learn physics and chemistry in English for 4th year ESO students. Students will study physics and chemistry concepts using an English textbook and online course, practicing their English skills while learning science. Although the teacher is not an English instructor, the course is designed to improve students' communication in English without formally evaluating their language level, with exams also conducted in English.

físicaanglès
Miscellaneous tips (1/2) Primitive operations are often faster than the corresponding function calls: var  a =  1 , b =  2 , c; c = Math.min(a, b); c = a < b ? a : b; If possible, avoid using  try...catch  in performance-critical sections: var  i; for  (i =  0 ; i <  100000 ; i++) { try  { ... }  catch  (e) { ... } } var  i; try  { for  (i =  0 ; i <  100000 ; i++) { ... } }  catch  (e) { ... } myArray.push(value); myArray[myArray.length] = value; myArray[idx++] = value;
Miscellaneous tips (2/2) If possible, avoid  for...in  in performance-critical sections: var  key, value; for  (key in myArray) { value = myArray[key]; ... } var  i, value, length = myArray.length; for  (i =  0 ; i < length; i++) { value = myArray[i]; ... } Branch outside, not inside, whenever the branching condition does not change: function  fn () { if  (...) { ... }  else  { ... } } var  fn; if  (...) { fn =  function  () {...}; }  else  { fn =  function  () {...}; }
Part 4 High Performance Dynamic HTML
Document tree modification Using  innerHTML var  i, j, el, table, tbody, row, cell; el = document.createElement( &quot;div&quot; ); document.body.appendChild(el); table = document.createElement( &quot;table&quot; ); el.appendChild(table); tbody = document.createElement( &quot;tbody&quot; ); table.appendChild(tbody); for  (i =  0 ; i <  1000 ; i++) { row = document.createElement( &quot;tr&quot; ); for  (j =  0 ; j <  5 ; j++) { cell = document.createElement( &quot;td&quot; ); row.appendChild(cell); } tbody.appendChild(row); } var  i, j, el, idx, html; idx =  0 ; html = []; html[idx++] =  &quot;<table>&quot; ; for  (i =  0 ; i <  1000 ; i++) { html[idx++] =  &quot;<tr>&quot; ; for  (j =  0 ; j <  5 ; j++) { html[idx++] =  &quot;<td></td>&quot; ; } html[idx++] =  &quot;</tr>&quot; ; } html[idx++] =  &quot;</table>&quot; ; el = document.createElement( &quot;div&quot; ); document.body.appendChild(el); el.innerHTML = html.join( &quot;&quot; ); ( much  faster on all A-grade browsers) Warning: See  http://www.julienlecomte.net/blog/2007/12/38/

Recommended for you

Topic Models - LDA and Correlated Topic Models
Topic Models - LDA and Correlated Topic ModelsTopic Models - LDA and Correlated Topic Models
Topic Models - LDA and Correlated Topic Models

The document discusses topic models like Latent Dirichlet Allocation (LDA) and Correlated Topic Models (CTM). LDA is a generative probabilistic model that can discover topics in a collection of documents and represent documents as mixtures over latent topics. CTM extends LDA by allowing topic correlations, since LDA assumes topic independence. CTM models topic proportions using a logistic normal distribution rather than LDA's Dirichlet distribution, allowing dependencies between topics.

topicmodels lda ctm
Testing Ajax, Mobile Apps the Agile Way
Testing Ajax, Mobile Apps the Agile WayTesting Ajax, Mobile Apps the Agile Way
Testing Ajax, Mobile Apps the Agile Way

Testers are under big new pressure to use Agile software methods, Ajax environments, and Mobile environments. In this session, Frank Cohen of Appvance will show how Best Buy and PepsiCo cope with the changes: How they select test tools, test management tools, and create operational test data. See how this all fits together in an Agile environment using Continuous Integration, Source Repository, Test Scripting, and Agile Test Management for Agile Stories. Frank will show practical examples - to the code level - to deal with desktop browsers, iOS and Android native apps, WebKit and Mobile Web browsers.

svnbest buyappium
Nodejs Applications in Production
Nodejs Applications in ProductionNodejs Applications in Production
Nodejs Applications in Production

The document discusses optimizing Node.js applications for production environments. It describes how as user numbers increase, challenges arise regarding stability and downtime that can be addressed through clustering. It also explains how an in-memory database like Redis can be used to share memory across clusters, and how a reverse proxy like Nginx can serve static files, SSL certificates, and gzip to optimize performance.

nodejs nginx redis performance production
Document tree modification Using  cloneNode var  i, j, el, table, tbody, row, cell; el = document.createElement( &quot;div&quot; ); document.body.appendChild(el); table = document.createElement( &quot;table&quot; ); el.appendChild(table); tbody = document.createElement( &quot;tbody&quot; ); table.appendChild(tbody); for  (i =  0 ; i <  1000 ; i++) { row = document.createElement( &quot;tr&quot; ); for  (j =  0 ; j <  5 ; j++) { cell = document.createElement( &quot;td&quot; ); row.appendChild(cell); } tbody.appendChild(row); } var  i, el, table, tbody, template, row, cell; el = document.createElement( &quot;div&quot; ); document.body.appendChild(el); table = document.createElement( &quot;table&quot; ); el.appendChild(table); tbody = document.createElement( &quot;tbody&quot; ); table.appendChild(tbody); template = document.createElement( &quot;tr&quot; ); for  (i =  0 ; i <  5 ; i++) { cell = document.createElement( &quot;td&quot; ); template.appendChild(cell); } for  (i =  0 ; i <  1000 ; i++) { row = template.cloneNode(true); tbody.appendChild(row); } (faster on all A-grade browsers – sometimes  much  faster) Warning: expando properties/attached event handlers are lost!
Document tree modification Using DocumentFragment A DocumentFragment (DOM Level 1 Core) is a lightweight Document object. It supports only a subset of the regular DOM methods and properties. IE’s implementation of the DocumentFragment interface does not comply with the W3C specification and returns a regular Document object. var  i, j, el, table, tbody, row, cell, docFragment; docFragment = document.createDocumentFragment(); el = document.createElement( &quot;div&quot; ); docFragment.appendChild(el); table = document.createElement( &quot;table&quot; ); el.appendChild(table); tbody = document.createElement( &quot;tbody&quot; ); table.appendChild(tbody); for  (i =  0 ; i <  1000 ; i++) { ... } document.body.appendChild(docFragment);
Limit the number of event handlers (1/2) Attaching an event handler to hundreds of elements is very costly Multiplying event handlers augments the potential for memory leaks Solution: Use  event delegation , a technique that relies on  event bubbling <div id= &quot;container&quot; > <ul> <li id= &quot;li-1&quot; > List Item 1 </li> <li id= &quot;li-2&quot; > List Item 2 </li> <li id= &quot;li-3&quot; > List Item 3 </li> <li id= &quot;li-4&quot; > List Item 4 </li> <li id= &quot;li-5&quot; > List Item 5 </li> ... </ul> </div> div#container ul li#li- x text node
Limit the number of event handlers (2/2) YAHOO.util.Event.addListener( &quot;container&quot; ,  &quot;click&quot; ,  function  (e) { var  el = YAHOO.util.Event.getTarget(e); while (el.id !==  &quot;container&quot; ) { if (el.nodeName.toUpperCase() ===  &quot;LI&quot; ) { // Do something here... break; } else { el = el.parentNode; } } });

Recommended for you

High Performance NodeJS
High Performance NodeJSHigh Performance NodeJS
High Performance NodeJS

Harimurti Prasetio (CTO NoLimit) - High Performance Node.js Dicoding Space - Bandung Developer Day 3 https://www.dicoding.com/events/76

Cloud Performance Testing with LoadRunner
Cloud Performance Testing with LoadRunnerCloud Performance Testing with LoadRunner
Cloud Performance Testing with LoadRunner

Presentation by Richard Bishop and Gordon Appleby at HP Discover 2014 in Barcelona. In the presentation, Richard and Gordon described their experiences in cloud-based performance testing. They discussed the increased adoption of the cloud as an application-testing platform as well as the evolution of HP’s cloud-based testing products including LoadRunner, Performance Center and StormRunner.

Quick Tour of Text Mining
Quick Tour of Text MiningQuick Tour of Text Mining
Quick Tour of Text Mining

The document provides an overview of text mining presented by Yi-Shin Chen. It discusses preprocessing text data which includes language detection, removing noise, stemming, POS tagging, and other techniques. It then covers basic concepts in natural language processing and parsing. Finally, it introduces basic data modeling concepts like the entity-relationship model and its use of entities, attributes, and relationships to represent data.

text mining
Limiting reflows Reflows happen whenever the DOM tree is manipulated. Browsers have optimizations you may take advantage of to minimize reflow: Modifying an invisible element (display:none) does not trigger reflow Modifying an element “off-DOM” does not trigger reflow Batch style changes: Change the value of the style attribute using setAttribute (does not work on Internet Explorer) Example: Change the value of the cssText property of the style object. Example: More maintainable: Change the CSS class name of an element. Example: el.style.cssText =  &quot;display:block;width:auto;height:100px;...&quot; ; YAHOO.util.Dom.replaceClass(el,  &quot;foo&quot; ,  &quot;bar&quot; ); el.setAttribute( &quot;style&quot; ,  &quot;display:block;width:auto;height:100px;...&quot; );
Miscellaneous tips... Consider using the  onmousedown  event instead of the  onclick  event Get a head start by making use of the small delay between the time a user presses the mouse button and the time he/she releases it. “ Downshift your code”: throttle frequent and expensive actions See  http://yuiblog.com/blog/2007/07/09/downshift-your-code/
Part 5 High Performance Layout and CSS
Miscellaneous tips... Use CSS Sprites for Snappy Image Replacement. Avoid using JavaScript for layout. window.onresize is throttled... Use pure CSS instead! Side benefits: improves maintainability, degrades more gracefully, etc. Avoid using Internet Explorer expressions Expressions are constantly evaluated in order to react to environment changes. There are ways to more safely use expressions, but in general, you shouldn’t need/use them. Avoid using Internet Explorer filters (or keep their use to a minimum) Optimize Table Layout Goal: allow the rendering engine to start rendering a table before it has received all the data Use table-layout:fixed Explicitly define a COL element for each column Set the WIDTH attribute on each col Optimize your CSS selectors  [  http://developer.mozilla.org/en/docs/Writing_Efficient_CSS  ]

Recommended for you

Extreme JavaScript Performance
Extreme JavaScript PerformanceExtreme JavaScript Performance
Extreme JavaScript Performance

Talk given at http://jsconf.eu 2009. You serve up your code gzipped. Your caches are properly configured. Your data (and scripts) are loaded on-demand. That's awesome—so don't stop there. Runtime is another source of slowdowns, and you can learn to conquer those, too. Learn how to benchmark your code to isolate performance issues, and what to do when you find them. The techniques you'll learn range from the normal (function inlining) to the extreme (unrolling loops).

optimizationjavascriptperformance
Lo Mejor de Cibeles Madrid Fashion Week - Otoño/Invierno 2010 - 2011
Lo Mejor de Cibeles Madrid Fashion Week - Otoño/Invierno 2010 - 2011Lo Mejor de Cibeles Madrid Fashion Week - Otoño/Invierno 2010 - 2011
Lo Mejor de Cibeles Madrid Fashion Week - Otoño/Invierno 2010 - 2011

Lo mejor de los mejores diseñadores (bajo mi criterio) de la Pasarela Cibeles para este Otoño/Invierno 2010 - 2011. Un resumen bastante completo de las nuevas tendencias e ideas para el próximo invierno, y para "oler" hacia donde va el mercado. Miss Compulsiva

pasarela cibelesmadrid fashion weekotoo invierno 2010 - 2011
Patrick Shields Digitising the Public Sector
Patrick Shields   Digitising the Public SectorPatrick Shields   Digitising the Public Sector
Patrick Shields Digitising the Public Sector

The document discusses what is required to enable digital government in South Africa. It summarizes that key building blocks include enterprise architecture and governance, performance management, organizational KPI reporting, application development, process-driven governance, risk and compliance management, and IT portfolio management. It then discusses capabilities requested by national, provincial and local departments and outlines the journey to digital government with increasing levels of automation and integration.

technologypublics sectorict
Part 6 High Performance Ajax
Ajax Best Practices Never resort to using synchronous XMLHttpRequest http://yuiblog.com/blog/2006/04/04/synchronous-v-asynchronous/ Asynchronous programming model slightly more complicated. Need to lock all or part of the UI while the transaction is pending. Programmatically handle network timeouts. Solution: Use the YUI Connection Manager: var  callback = { success:  function  () {  /* Do something */  }, failure:  function  () {  /* Do something */  }, timeout:  5000 }; YAHOO.util.Connect.asyncRequest( &quot;GET&quot; , url, callback);
Improving perceived network latency using the optimistic pattern If the data is validated locally (on the client, using JavaScript) before being sent to the server, the request will be successful in 99.9% of the cases. Therefore, in order to optimize the user experience, we should assume a successful outcome and adopt the following pattern: Update the UI when the request gets sent. Lock the UI/data structures with the finest possible granularity. Let the user know that something is happening. Let the user know why a UI object is locked. Unlock the UI/data structures when the outcome is successful. Handle error cases gracefully.
Miscellaneous tips... Be aware of the maximum number of concurrent HTTP/1.1 connections. Multiplex Ajax requests whenever possible, and if your backend supports it. Piggyback unsollicited notifications in a response to an Ajax request. Favor JSON over XML as your data exchange format Accessing a JSON data structure is easier and cheaper than accessing XML data. JSON has less overhead than XML. Push, don’t poll. Use  COMET  to send real-time notifications to the browser. Consider using local storage to cache data locally, request a diff from the server: Internet Explorer’s userData Flash local storage DOM:Storage (WhatWG persistent storage API, implemented in Firefox 2) Google Gears etc.

Recommended for you

Thought Leadership from Social Sector Masters
Thought Leadership from Social Sector MastersThought Leadership from Social Sector Masters
Thought Leadership from Social Sector Masters

Some of the nation’s leading CRM thought leaders joined together for a lively and entertaining discussion about top marketing and CRM trends and best practices. This presentation is geared for social sector practitioners looking to take top lessons from different industries and apply them to their organization or campus. Tap over 75 years of combined experience on strategies to make customer initiatives successful from these featured thought leaders.

social mediasalesforcesalesforce foundation
同玩節海報事件
同玩節海報事件同玩節海報事件
同玩節海報事件

The document discusses yeast molecular biology and genetics. It provides information on commonly used yeast species Saccharomyces cerevisiae and Schizosaccharomyces pombe. It discusses yeast genome, life cycle, vectors, cloning, transformation methods, and applications including gene expression and making mutants.

Comic Analysis
Comic AnalysisComic Analysis
Comic Analysis

1) The Avengers gather for a gala celebrating the opening of their new headquarters in New York City. Meanwhile, there is a security breach detected in the command center. 2) Captain America, Vision, and Sandman investigate and find an intruder claiming to be Doctor Doom in the sub-basement. After several fights and escapes, the real Doctor Doom is discovered disguised as Iron Man. 3) The issue ends with Doctor Doom taking control of the Avengers headquarters in a cliffhanger moment.

Part 7 Performance Tools
Performance Tools YSlow?  [  http://developer.yahoo.com/yslow/  ] Task manager IE Leak Detector a.k.a Drip  [  http://www.outofhanwell.com/ieleak/  ] Stopwatch profiling AjaxView  [  http://research.microsoft.com/projects/ajaxview/  ] JsLex  [  http://rockstarapps.com/pmwiki/pmwiki.php?n=JsLex.JsLex  ] YUI profiler [  http://developer.yahoo.com/yui/profiler/  ] Venkman or Firebug Profiler  [  http://www.getfirebug.com/  ]

More Related Content

What's hot

Jen Penaluna: Red Light, Green Light Interviewing Potential Employers | Brigh...
Jen Penaluna: Red Light, Green Light Interviewing Potential Employers | Brigh...Jen Penaluna: Red Light, Green Light Interviewing Potential Employers | Brigh...
Jen Penaluna: Red Light, Green Light Interviewing Potential Employers | Brigh...
JenPenaluna
 
Core Web Vitals and Your Search Rankings
Core Web Vitals and Your Search Rankings Core Web Vitals and Your Search Rankings
Core Web Vitals and Your Search Rankings
Michael King
 
Progressive Web Apps (PWAs): Why you want one & how to optimize them #Applaus...
Progressive Web Apps (PWAs): Why you want one & how to optimize them #Applaus...Progressive Web Apps (PWAs): Why you want one & how to optimize them #Applaus...
Progressive Web Apps (PWAs): Why you want one & how to optimize them #Applaus...
Aleyda Solís
 
The secret web performance metric no one is talking about
The secret web performance metric no one is talking aboutThe secret web performance metric no one is talking about
The secret web performance metric no one is talking about
Anna Migas
 
Scaling SEO by Building Products - Search London Meetup Nov 17
Scaling SEO by Building Products - Search London Meetup Nov 17Scaling SEO by Building Products - Search London Meetup Nov 17
Scaling SEO by Building Products - Search London Meetup Nov 17
Fabrizio Ballarini
 
Cómo Desarrollar Auditorías que Maximicen el éxito SEO #SEODay
Cómo Desarrollar Auditorías que Maximicen el éxito SEO #SEODayCómo Desarrollar Auditorías que Maximicen el éxito SEO #SEODay
Cómo Desarrollar Auditorías que Maximicen el éxito SEO #SEODay
Aleyda Solís
 
Canonicalization for SEO BrightonSEO April 2023 Patrick Stox
Canonicalization for SEO BrightonSEO April 2023 Patrick StoxCanonicalization for SEO BrightonSEO April 2023 Patrick Stox
Canonicalization for SEO BrightonSEO April 2023 Patrick Stox
Ahrefs
 
Web Performance Optimization
Web Performance OptimizationWeb Performance Optimization
Web Performance Optimization
Livares Technologies Pvt Ltd
 
Core Web Vitals - The Modern Web Experience
Core Web Vitals - The Modern Web ExperienceCore Web Vitals - The Modern Web Experience
Core Web Vitals - The Modern Web Experience
Cakra Danu Sedayu
 
Brighton SEO 2021 - A Deep Dive into the Depths of DevTools
Brighton SEO 2021 - A Deep Dive into the Depths of DevToolsBrighton SEO 2021 - A Deep Dive into the Depths of DevTools
Brighton SEO 2021 - A Deep Dive into the Depths of DevTools
ChrisJohnson792
 
How to Use Search Intent to Dominate Google Discover
How to Use Search Intent to Dominate Google DiscoverHow to Use Search Intent to Dominate Google Discover
How to Use Search Intent to Dominate Google Discover
Felipe Bazon
 
How to get more traffic with less content - BrightonSEO
How to get more traffic with less content - BrightonSEOHow to get more traffic with less content - BrightonSEO
How to get more traffic with less content - BrightonSEO
Anna Gregory-Hall
 
BrightonSEO Slides April 2023
BrightonSEO Slides April 2023BrightonSEO Slides April 2023
BrightonSEO Slides April 2023
Cheryl Luzet
 
Organigrama del concejo municipal de sucre del estado bolivariano de miranda
Organigrama del concejo municipal de sucre del estado bolivariano de mirandaOrganigrama del concejo municipal de sucre del estado bolivariano de miranda
Organigrama del concejo municipal de sucre del estado bolivariano de miranda
José Rivas
 
E-Commerce SEO Horror Stories : How to tackle the most common issues 
at scal...
E-Commerce SEO Horror Stories : How to tackle the most common issues 
at scal...E-Commerce SEO Horror Stories : How to tackle the most common issues 
at scal...
E-Commerce SEO Horror Stories : How to tackle the most common issues 
at scal...
Aleyda Solís
 
개발자를 위한 (블로그) 글쓰기 intro
개발자를 위한 (블로그) 글쓰기 intro개발자를 위한 (블로그) 글쓰기 intro
개발자를 위한 (블로그) 글쓰기 intro
Seongyun Byeon
 
Real-World Performance Budgets [PerfNow 2022]
Real-World Performance Budgets [PerfNow 2022]Real-World Performance Budgets [PerfNow 2022]
Real-World Performance Budgets [PerfNow 2022]
Tammy Everts
 
The Big SEO Migration - Learnings from a first time hiker
The Big SEO Migration - Learnings from a first time hiker The Big SEO Migration - Learnings from a first time hiker
The Big SEO Migration - Learnings from a first time hiker
ReneHarris7
 
Hannah Rogers - Facing Your SEO Fears: Forecasting
Hannah Rogers - Facing Your SEO Fears: ForecastingHannah Rogers - Facing Your SEO Fears: Forecasting
Hannah Rogers - Facing Your SEO Fears: Forecasting
HannahRogers52
 
No More "It Depends" - Learn to Set your Visual SEO Resources #LondonSEOMeetu...
No More "It Depends" - Learn to Set your Visual SEO Resources #LondonSEOMeetu...No More "It Depends" - Learn to Set your Visual SEO Resources #LondonSEOMeetu...
No More "It Depends" - Learn to Set your Visual SEO Resources #LondonSEOMeetu...
Aleyda Solís
 

What's hot (20)

Jen Penaluna: Red Light, Green Light Interviewing Potential Employers | Brigh...
Jen Penaluna: Red Light, Green Light Interviewing Potential Employers | Brigh...Jen Penaluna: Red Light, Green Light Interviewing Potential Employers | Brigh...
Jen Penaluna: Red Light, Green Light Interviewing Potential Employers | Brigh...
 
Core Web Vitals and Your Search Rankings
Core Web Vitals and Your Search Rankings Core Web Vitals and Your Search Rankings
Core Web Vitals and Your Search Rankings
 
Progressive Web Apps (PWAs): Why you want one & how to optimize them #Applaus...
Progressive Web Apps (PWAs): Why you want one & how to optimize them #Applaus...Progressive Web Apps (PWAs): Why you want one & how to optimize them #Applaus...
Progressive Web Apps (PWAs): Why you want one & how to optimize them #Applaus...
 
The secret web performance metric no one is talking about
The secret web performance metric no one is talking aboutThe secret web performance metric no one is talking about
The secret web performance metric no one is talking about
 
Scaling SEO by Building Products - Search London Meetup Nov 17
Scaling SEO by Building Products - Search London Meetup Nov 17Scaling SEO by Building Products - Search London Meetup Nov 17
Scaling SEO by Building Products - Search London Meetup Nov 17
 
Cómo Desarrollar Auditorías que Maximicen el éxito SEO #SEODay
Cómo Desarrollar Auditorías que Maximicen el éxito SEO #SEODayCómo Desarrollar Auditorías que Maximicen el éxito SEO #SEODay
Cómo Desarrollar Auditorías que Maximicen el éxito SEO #SEODay
 
Canonicalization for SEO BrightonSEO April 2023 Patrick Stox
Canonicalization for SEO BrightonSEO April 2023 Patrick StoxCanonicalization for SEO BrightonSEO April 2023 Patrick Stox
Canonicalization for SEO BrightonSEO April 2023 Patrick Stox
 
Web Performance Optimization
Web Performance OptimizationWeb Performance Optimization
Web Performance Optimization
 
Core Web Vitals - The Modern Web Experience
Core Web Vitals - The Modern Web ExperienceCore Web Vitals - The Modern Web Experience
Core Web Vitals - The Modern Web Experience
 
Brighton SEO 2021 - A Deep Dive into the Depths of DevTools
Brighton SEO 2021 - A Deep Dive into the Depths of DevToolsBrighton SEO 2021 - A Deep Dive into the Depths of DevTools
Brighton SEO 2021 - A Deep Dive into the Depths of DevTools
 
How to Use Search Intent to Dominate Google Discover
How to Use Search Intent to Dominate Google DiscoverHow to Use Search Intent to Dominate Google Discover
How to Use Search Intent to Dominate Google Discover
 
How to get more traffic with less content - BrightonSEO
How to get more traffic with less content - BrightonSEOHow to get more traffic with less content - BrightonSEO
How to get more traffic with less content - BrightonSEO
 
BrightonSEO Slides April 2023
BrightonSEO Slides April 2023BrightonSEO Slides April 2023
BrightonSEO Slides April 2023
 
Organigrama del concejo municipal de sucre del estado bolivariano de miranda
Organigrama del concejo municipal de sucre del estado bolivariano de mirandaOrganigrama del concejo municipal de sucre del estado bolivariano de miranda
Organigrama del concejo municipal de sucre del estado bolivariano de miranda
 
E-Commerce SEO Horror Stories : How to tackle the most common issues 
at scal...
E-Commerce SEO Horror Stories : How to tackle the most common issues 
at scal...E-Commerce SEO Horror Stories : How to tackle the most common issues 
at scal...
E-Commerce SEO Horror Stories : How to tackle the most common issues 
at scal...
 
개ᄇ���ᆯ자를 위한 (블로그) 글쓰기 intro
개발자를 위한 (블로그) 글쓰기 intro개발자를 위한 (블로그) 글쓰기 intro
개발자를 위한 (블로그) 글쓰기 intro
 
Real-World Performance Budgets [PerfNow 2022]
Real-World Performance Budgets [PerfNow 2022]Real-World Performance Budgets [PerfNow 2022]
Real-World Performance Budgets [PerfNow 2022]
 
The Big SEO Migration - Learnings from a first time hiker
The Big SEO Migration - Learnings from a first time hiker The Big SEO Migration - Learnings from a first time hiker
The Big SEO Migration - Learnings from a first time hiker
 
Hannah Rogers - Facing Your SEO Fears: Forecasting
Hannah Rogers - Facing Your SEO Fears: ForecastingHannah Rogers - Facing Your SEO Fears: Forecasting
Hannah Rogers - Facing Your SEO Fears: Forecasting
 
No More "It Depends" - Learn to Set your Visual SEO Resources #LondonSEOMeetu...
No More "It Depends" - Learn to Set your Visual SEO Resources #LondonSEOMeetu...No More "It Depends" - Learn to Set your Visual SEO Resources #LondonSEOMeetu...
No More "It Depends" - Learn to Set your Visual SEO Resources #LondonSEOMeetu...
 

Viewers also liked

Phyche
PhychePhyche
Phyche
Mireia Ribas
 
Topic Models - LDA and Correlated Topic Models
Topic Models - LDA and Correlated Topic ModelsTopic Models - LDA and Correlated Topic Models
Topic Models - LDA and Correlated Topic Models
Claudia Wagner
 
Testing Ajax, Mobile Apps the Agile Way
Testing Ajax, Mobile Apps the Agile WayTesting Ajax, Mobile Apps the Agile Way
Testing Ajax, Mobile Apps the Agile Way
Clever Moe
 
Nodejs Applications in Production
Nodejs Applications in ProductionNodejs Applications in Production
Nodejs Applications in Production
Hamidreza Soleimani
 
High Performance NodeJS
High Performance NodeJSHigh Performance NodeJS
High Performance NodeJS
Dicoding
 
Cloud Performance Testing with LoadRunner
Cloud Performance Testing with LoadRunnerCloud Performance Testing with LoadRunner
Cloud Performance Testing with LoadRunner
Richard Bishop
 
Quick Tour of Text Mining
Quick Tour of Text MiningQuick Tour of Text Mining
Quick Tour of Text Mining
Yi-Shin Chen
 
Extreme JavaScript Performance
Extreme JavaScript PerformanceExtreme JavaScript Performance
Extreme JavaScript Performance
Thomas Fuchs
 
Lo Mejor de Cibeles Madrid Fashion Week - Otoño/Invierno 2010 - 2011
Lo Mejor de Cibeles Madrid Fashion Week - Otoño/Invierno 2010 - 2011Lo Mejor de Cibeles Madrid Fashion Week - Otoño/Invierno 2010 - 2011
Lo Mejor de Cibeles Madrid Fashion Week - Otoño/Invierno 2010 - 2011
Compulsiva Accesorios
 
Patrick Shields Digitising the Public Sector
Patrick Shields   Digitising the Public SectorPatrick Shields   Digitising the Public Sector
Patrick Shields Digitising the Public Sector
Software AG South Africa
 
Thought Leadership from Social Sector Masters
Thought Leadership from Social Sector MastersThought Leadership from Social Sector Masters
Thought Leadership from Social Sector Masters
Salesforce.org
 
同玩節海報事件
同玩節海報事件同玩節海報事件
同玩節海報事件
lalacamp07
 
Comic Analysis
Comic AnalysisComic Analysis
Comic Analysis
Westminster MassComm
 
The Distribution of Household Income, Federal Taxes, and Government Spending
The Distribution of Household Income, Federal Taxes, and Government SpendingThe Distribution of Household Income, Federal Taxes, and Government Spending
The Distribution of Household Income, Federal Taxes, and Government Spending
Congressional Budget Office
 
Your Garden and Global Warming
Your Garden and Global WarmingYour Garden and Global Warming
Your Garden and Global Warming
School Vegetable Gardening - Victory Gardens
 
Quick Introduction to the Semantic Web, RDFa & Microformats
Quick Introduction to the Semantic Web, RDFa & MicroformatsQuick Introduction to the Semantic Web, RDFa & Microformats
Quick Introduction to the Semantic Web, RDFa & Microformats
University of California, San Diego
 
4º básico a semana 25 abril al 29 abril
4º básico a  semana 25 abril  al 29 abril4º básico a  semana 25 abril  al 29 abril
4º básico a semana 25 abril al 29 abril
Colegio Camilo Henríquez
 
KungFuPR
KungFuPRKungFuPR
KungFuPR
Ben Shipley
 
LAST Conference - The Mickey Mouse model of leadership for software delivery ...
LAST Conference - The Mickey Mouse model of leadership for software delivery ...LAST Conference - The Mickey Mouse model of leadership for software delivery ...
LAST Conference - The Mickey Mouse model of leadership for software delivery ...
Nish Mahanty
 
Driving school
Driving schoolDriving school
Driving school
Rajsafe Drivingschool
 

Viewers also liked (20)

Phyche
PhychePhyche
Phyche
 
Topic Models - LDA and Correlated Topic Models
Topic Models - LDA and Correlated Topic ModelsTopic Models - LDA and Correlated Topic Models
Topic Models - LDA and Correlated Topic Models
 
Testing Ajax, Mobile Apps the Agile Way
Testing Ajax, Mobile Apps the Agile WayTesting Ajax, Mobile Apps the Agile Way
Testing Ajax, Mobile Apps the Agile Way
 
Nodejs Applications in Production
Nodejs Applications in ProductionNodejs Applications in Production
Nodejs Applications in Production
 
High Performance NodeJS
High Performance NodeJSHigh Performance NodeJS
High Performance NodeJS
 
Cloud Performance Testing with LoadRunner
Cloud Performance Testing with LoadRunnerCloud Performance Testing with LoadRunner
Cloud Performance Testing with LoadRunner
 
Quick Tour of Text Mining
Quick Tour of Text MiningQuick Tour of Text Mining
Quick Tour of Text Mining
 
Extreme JavaScript Performance
Extreme JavaScript PerformanceExtreme JavaScript Performance
Extreme JavaScript Performance
 
Lo Mejor de Cibeles Madrid Fashion Week - Otoño/Invierno 2010 - 2011
Lo Mejor de Cibeles Madrid Fashion Week - Otoño/Invierno 2010 - 2011Lo Mejor de Cibeles Madrid Fashion Week - Otoño/Invierno 2010 - 2011
Lo Mejor de Cibeles Madrid Fashion Week - Otoño/Invierno 2010 - 2011
 
Patrick Shields Digitising the Public Sector
Patrick Shields   Digitising the Public SectorPatrick Shields   Digitising the Public Sector
Patrick Shields Digitising the Public Sector
 
Thought Leadership from Social Sector Masters
Thought Leadership from Social Sector MastersThought Leadership from Social Sector Masters
Thought Leadership from Social Sector Masters
 
同玩節海報事件
同玩節海報事件同玩節海報事件
同玩節海報事件
 
Comic Analysis
Comic AnalysisComic Analysis
Comic Analysis
 
The Distribution of Household Income, Federal Taxes, and Government Spending
The Distribution of Household Income, Federal Taxes, and Government SpendingThe Distribution of Household Income, Federal Taxes, and Government Spending
The Distribution of Household Income, Federal Taxes, and Government Spending
 
Your Garden and Global Warming
Your Garden and Global WarmingYour Garden and Global Warming
Your Garden and Global Warming
 
Quick Introduction to the Semantic Web, RDFa & Microformats
Quick Introduction to the Semantic Web, RDFa & MicroformatsQuick Introduction to the Semantic Web, RDFa & Microformats
Quick Introduction to the Semantic Web, RDFa & Microformats
 
4º básico a semana 25 abril al 29 abril
4º básico a  semana 25 abril  al 29 abril4º básico a  semana 25 abril  al 29 abril
4º básico a semana 25 abril al 29 abril
 
KungFuPR
KungFuPRKungFuPR
KungFuPR
 
LAST Conference - The Mickey Mouse model of leadership for software delivery ...
LAST Conference - The Mickey Mouse model of leadership for software delivery ...LAST Conference - The Mickey Mouse model of leadership for software delivery ...
LAST Conference - The Mickey Mouse model of leadership for software delivery ...
 
Driving school
Driving schoolDriving school
Driving school
 

Similar to High Performance Ajax Applications

Angular Optimization Web Performance Meetup
Angular Optimization Web Performance MeetupAngular Optimization Web Performance Meetup
Angular Optimization Web Performance Meetup
David Barreto
 
Angular performance slides
Angular performance slidesAngular performance slides
Angular performance slides
David Barreto
 
Silicon Valley CodeCamp 2008: High performance Ajax with ExtJS and ASP.NET
Silicon Valley CodeCamp 2008: High performance Ajax with ExtJS and ASP.NETSilicon Valley CodeCamp 2008: High performance Ajax with ExtJS and ASP.NET
Silicon Valley CodeCamp 2008: High performance Ajax with ExtJS and ASP.NET
Mats Bryntse
 
The Web on OSGi: Here's How
The Web on OSGi: Here's HowThe Web on OSGi: Here's How
The Web on OSGi: Here's How
mrdon
 
My 70-480 HTML5 certification learning
My 70-480 HTML5 certification learningMy 70-480 HTML5 certification learning
My 70-480 HTML5 certification learning
Syed Irtaza Ali
 
Ajax Performance
Ajax PerformanceAjax Performance
Ajax Performance
kaven yan
 
The Theory Of The Dom
The Theory Of The DomThe Theory Of The Dom
The Theory Of The Dom
kaven yan
 
From Zero to Hero – Web Performance
From Zero to Hero – Web PerformanceFrom Zero to Hero – Web Performance
From Zero to Hero – Web Performance
Sebastian Springer
 
Developing High Performance Web Apps
Developing High Performance Web AppsDeveloping High Performance Web Apps
Developing High Performance Web Apps
Timothy Fisher
 
Full Stack React Workshop [CSSC x GDSC]
Full Stack React Workshop [CSSC x GDSC]Full Stack React Workshop [CSSC x GDSC]
Full Stack React Workshop [CSSC x GDSC]
GDSC UofT Mississauga
 
Writing and Testing JavaScript-heavy Web 2.0 apps with JSUnit
Writing and Testing JavaScript-heavy Web 2.0 apps with JSUnitWriting and Testing JavaScript-heavy Web 2.0 apps with JSUnit
Writing and Testing JavaScript-heavy Web 2.0 apps with JSUnit
Alex Chaffee
 
Front-end optimisation & jQuery Internals (Pycon)
Front-end optimisation & jQuery Internals (Pycon)Front-end optimisation & jQuery Internals (Pycon)
Front-end optimisation & jQuery Internals (Pycon)
Artur Cistov
 
GWT is Smarter Than You
GWT is Smarter Than YouGWT is Smarter Than You
GWT is Smarter Than You
Robert Cooper
 
Asp.net performance
Asp.net performanceAsp.net performance
Asp.net performance
Abhishek Sur
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
Andy Peterson
 
Enhance Web Performance
Enhance Web PerformanceEnhance Web Performance
Enhance Web Performance
Adam Lu
 
Top 7 Angular Best Practices to Organize Your Angular App
Top 7 Angular Best Practices to Organize Your Angular AppTop 7 Angular Best Practices to Organize Your Angular App
Top 7 Angular Best Practices to Organize Your Angular App
Katy Slemon
 
Javascript ui for rest services
Javascript ui for rest servicesJavascript ui for rest services
Javascript ui for rest services
Ioan Eugen Stan
 
eXo SEA - JavaScript Introduction Training
eXo SEA - JavaScript Introduction TrainingeXo SEA - JavaScript Introduction Training
eXo SEA - JavaScript Introduction Training
Hoat Le
 
backend
backendbackend
backend
tutorialsruby
 

Similar to High Performance Ajax Applications (20)

Angular Optimization Web Performance Meetup
Angular Optimization Web Performance MeetupAngular Optimization Web Performance Meetup
Angular Optimization Web Performance Meetup
 
Angular performance slides
Angular performance slidesAngular performance slides
Angular performance slides
 
Silicon Valley CodeCamp 2008: High performance Ajax with ExtJS and ASP.NET
Silicon Valley CodeCamp 2008: High performance Ajax with ExtJS and ASP.NETSilicon Valley CodeCamp 2008: High performance Ajax with ExtJS and ASP.NET
Silicon Valley CodeCamp 2008: High performance Ajax with ExtJS and ASP.NET
 
The Web on OSGi: Here's How
The Web on OSGi: Here's HowThe Web on OSGi: Here's How
The Web on OSGi: Here's How
 
My 70-480 HTML5 certification learning
My 70-480 HTML5 certification learningMy 70-480 HTML5 certification learning
My 70-480 HTML5 certification learning
 
Ajax Performance
Ajax PerformanceAjax Performance
Ajax Performance
 
The Theory Of The Dom
The Theory Of The DomThe Theory Of The Dom
The Theory Of The Dom
 
From Zero to Hero – Web Performance
From Zero to Hero – Web PerformanceFrom Zero to Hero – Web Performance
From Zero to Hero – Web Performance
 
Developing High Performance Web Apps
Developing High Performance Web AppsDeveloping High Performance Web Apps
Developing High Performance Web Apps
 
Full Stack React Workshop [CSSC x GDSC]
Full Stack React Workshop [CSSC x GDSC]Full Stack React Workshop [CSSC x GDSC]
Full Stack React Workshop [CSSC x GDSC]
 
Writing and Testing JavaScript-heavy Web 2.0 apps with JSUnit
Writing and Testing JavaScript-heavy Web 2.0 apps with JSUnitWriting and Testing JavaScript-heavy Web 2.0 apps with JSUnit
Writing and Testing JavaScript-heavy Web 2.0 apps with JSUnit
 
Front-end optimisation & jQuery Internals (Pycon)
Front-end optimisation & jQuery Internals (Pycon)Front-end optimisation & jQuery Internals (Pycon)
Front-end optimisation & jQuery Internals (Pycon)
 
GWT is Smarter Than You
GWT is Smarter Than YouGWT is Smarter Than You
GWT is Smarter Than You
 
Asp.net performance
Asp.net performanceAsp.net performance
Asp.net performance
 
Javascript unit testing, yes we can e big
Javascript unit testing, yes we can   e bigJavascript unit testing, yes we can   e big
Javascript unit testing, yes we can e big
 
Enhance Web Performance
Enhance Web PerformanceEnhance Web Performance
Enhance Web Performance
 
Top 7 Angular Best Practices to Organize Your Angular App
Top 7 Angular Best Practices to Organize Your Angular AppTop 7 Angular Best Practices to Organize Your Angular App
Top 7 Angular Best Practices to Organize Your Angular App
 
Javascript ui for rest services
Javascript ui for rest servicesJavascript ui for rest services
Javascript ui for rest services
 
eXo SEA - JavaScript Introduction Training
eXo SEA - JavaScript Introduction TrainingeXo SEA - JavaScript Introduction Training
eXo SEA - JavaScript Introduction Training
 
backend
backendbackend
backend
 

Recently uploaded

Manual | Product | Research Presentation
Manual | Product | Research PresentationManual | Product | Research Presentation
Manual | Product | Research Presentation
welrejdoall
 
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Erasmo Purificato
 
Measuring the Impact of Network Latency at Twitter
Measuring the Impact of Network Latency at TwitterMeasuring the Impact of Network Latency at Twitter
Measuring the Impact of Network Latency at Twitter
ScyllaDB
 
Calgary MuleSoft Meetup APM and IDP .pptx
Calgary MuleSoft Meetup APM and IDP .pptxCalgary MuleSoft Meetup APM and IDP .pptx
Calgary MuleSoft Meetup APM and IDP .pptx
ishalveerrandhawa1
 
How Social Media Hackers Help You to See Your Wife's Message.pdf
How Social Media Hackers Help You to See Your Wife's Message.pdfHow Social Media Hackers Help You to See Your Wife's Message.pdf
How Social Media Hackers Help You to See Your Wife's Message.pdf
HackersList
 
Best Practices for Effectively Running dbt in Airflow.pdf
Best Practices for Effectively Running dbt in Airflow.pdfBest Practices for Effectively Running dbt in Airflow.pdf
Best Practices for Effectively Running dbt in Airflow.pdf
Tatiana Al-Chueyr
 
What's New in Copilot for Microsoft365 May 2024.pptx
What's New in Copilot for Microsoft365 May 2024.pptxWhat's New in Copilot for Microsoft365 May 2024.pptx
What's New in Copilot for Microsoft365 May 2024.pptx
Stephanie Beckett
 
Cookies program to display the information though cookie creation
Cookies program to display the information though cookie creationCookies program to display the information though cookie creation
Cookies program to display the information though cookie creation
shanthidl1
 
Research Directions for Cross Reality Interfaces
Research Directions for Cross Reality InterfacesResearch Directions for Cross Reality Interfaces
Research Directions for Cross Reality Interfaces
Mark Billinghurst
 
Best Programming Language for Civil Engineers
Best Programming Language for Civil EngineersBest Programming Language for Civil Engineers
Best Programming Language for Civil Engineers
Awais Yaseen
 
Details of description part II: Describing images in practice - Tech Forum 2024
Details of description part II: Describing images in practice - Tech Forum 2024Details of description part II: Describing images in practice - Tech Forum 2024
Details of description part II: Describing images in practice - Tech Forum 2024
BookNet Canada
 
20240702 QFM021 Machine Intelligence Reading List June 2024
20240702 QFM021 Machine Intelligence Reading List June 202420240702 QFM021 Machine Intelligence Reading List June 2024
20240702 QFM021 Machine Intelligence Reading List June 2024
Matthew Sinclair
 
Choose our Linux Web Hosting for a seamless and successful online presence
Choose our Linux Web Hosting for a seamless and successful online presenceChoose our Linux Web Hosting for a seamless and successful online presence
Choose our Linux Web Hosting for a seamless and successful online presence
rajancomputerfbd
 
TrustArc Webinar - 2024 Data Privacy Trends: A Mid-Year Check-In
TrustArc Webinar - 2024 Data Privacy Trends: A Mid-Year Check-InTrustArc Webinar - 2024 Data Privacy Trends: A Mid-Year Check-In
TrustArc Webinar - 2024 Data Privacy Trends: A Mid-Year Check-In
TrustArc
 
WPRiders Company Presentation Slide Deck
WPRiders Company Presentation Slide DeckWPRiders Company Presentation Slide Deck
WPRiders Company Presentation Slide Deck
Lidia A.
 
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdfWhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
ArgaBisma
 
Quantum Communications Q&A with Gemini LLM
Quantum Communications Q&A with Gemini LLMQuantum Communications Q&A with Gemini LLM
Quantum Communications Q&A with Gemini LLM
Vijayananda Mohire
 
Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...
Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...
Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...
Chris Swan
 
Comparison Table of DiskWarrior Alternatives.pdf
Comparison Table of DiskWarrior Alternatives.pdfComparison Table of DiskWarrior Alternatives.pdf
Comparison Table of DiskWarrior Alternatives.pdf
Andrey Yasko
 
Transcript: Details of description part II: Describing images in practice - T...
Transcript: Details of description part II: Describing images in practice - T...Transcript: Details of description part II: Describing images in practice - T...
Transcript: Details of description part II: Describing images in practice - T...
BookNet Canada
 

Recently uploaded (20)

Manual | Product | Research Presentation
Manual | Product | Research PresentationManual | Product | Research Presentation
Manual | Product | Research Presentation
 
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
Paradigm Shifts in User Modeling: A Journey from Historical Foundations to Em...
 
Measuring the Impact of Network Latency at Twitter
Measuring the Impact of Network Latency at TwitterMeasuring the Impact of Network Latency at Twitter
Measuring the Impact of Network Latency at Twitter
 
Calgary MuleSoft Meetup APM and IDP .pptx
Calgary MuleSoft Meetup APM and IDP .pptxCalgary MuleSoft Meetup APM and IDP .pptx
Calgary MuleSoft Meetup APM and IDP .pptx
 
How Social Media Hackers Help You to See Your Wife's Message.pdf
How Social Media Hackers Help You to See Your Wife's Message.pdfHow Social Media Hackers Help You to See Your Wife's Message.pdf
How Social Media Hackers Help You to See Your Wife's Message.pdf
 
Best Practices for Effectively Running dbt in Airflow.pdf
Best Practices for Effectively Running dbt in Airflow.pdfBest Practices for Effectively Running dbt in Airflow.pdf
Best Practices for Effectively Running dbt in Airflow.pdf
 
What's New in Copilot for Microsoft365 May 2024.pptx
What's New in Copilot for Microsoft365 May 2024.pptxWhat's New in Copilot for Microsoft365 May 2024.pptx
What's New in Copilot for Microsoft365 May 2024.pptx
 
Cookies program to display the information though cookie creation
Cookies program to display the information though cookie creationCookies program to display the information though cookie creation
Cookies program to display the information though cookie creation
 
Research Directions for Cross Reality Interfaces
Research Directions for Cross Reality InterfacesResearch Directions for Cross Reality Interfaces
Research Directions for Cross Reality Interfaces
 
Best Programming Language for Civil Engineers
Best Programming Language for Civil EngineersBest Programming Language for Civil Engineers
Best Programming Language for Civil Engineers
 
Details of description part II: Describing images in practice - Tech Forum 2024
Details of description part II: Describing images in practice - Tech Forum 2024Details of description part II: Describing images in practice - Tech Forum 2024
Details of description part II: Describing images in practice - Tech Forum 2024
 
20240702 QFM021 Machine Intelligence Reading List June 2024
20240702 QFM021 Machine Intelligence Reading List June 202420240702 QFM021 Machine Intelligence Reading List June 2024
20240702 QFM021 Machine Intelligence Reading List June 2024
 
Choose our Linux Web Hosting for a seamless and successful online presence
Choose our Linux Web Hosting for a seamless and successful online presenceChoose our Linux Web Hosting for a seamless and successful online presence
Choose our Linux Web Hosting for a seamless and successful online presence
 
TrustArc Webinar - 2024 Data Privacy Trends: A Mid-Year Check-In
TrustArc Webinar - 2024 Data Privacy Trends: A Mid-Year Check-InTrustArc Webinar - 2024 Data Privacy Trends: A Mid-Year Check-In
TrustArc Webinar - 2024 Data Privacy Trends: A Mid-Year Check-In
 
WPRiders Company Presentation Slide Deck
WPRiders Company Presentation Slide DeckWPRiders Company Presentation Slide Deck
WPRiders Company Presentation Slide Deck
 
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdfWhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
WhatsApp Image 2024-03-27 at 08.19.52_bfd93109.pdf
 
Quantum Communications Q&A with Gemini LLM
Quantum Communications Q&A with Gemini LLMQuantum Communications Q&A with Gemini LLM
Quantum Communications Q&A with Gemini LLM
 
Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...
Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...
Fluttercon 2024: Showing that you care about security - OpenSSF Scorecards fo...
 
Comparison Table of DiskWarrior Alternatives.pdf
Comparison Table of DiskWarrior Alternatives.pdfComparison Table of DiskWarrior Alternatives.pdf
Comparison Table of DiskWarrior Alternatives.pdf
 
Transcript: Details of description part II: Describing images in practice - T...
Transcript: Details of description part II: Describing images in practice - T...Transcript: Details of description part II: Describing images in practice - T...
Transcript: Details of description part II: Describing images in practice - T...
 

High Performance Ajax Applications

  • 1. High Performance Ajax Applications Julien Lecomte http://www.julienlecomte.net/blogfiles/performance/ajax-perf.ppt http://www.slideshare.net/julien.lecomte/high-performance-ajax-applications
  • 2. Part 1 Developing For High Performance
  • 3. Planning and designing for high performance Plan for performance from day 1 Work closely with designers and product managers Understand design rationale Explain the tradeoffs between design and performance Offer alternatives and show what is possible (prototype) Challenge yourself to implement challenging designs (don't just say no) Help simplify the design and interaction if needed (compromise)
  • 4. Engineering high performance: A few basic rules Less is more Don’t do anything unnecessary. Don’t do anything until it becomes absolutely necessary. Break the rules Make compromises and break best practices, but only as a last resort! Work on improving perceived performance Users can deal with some reasonable amount of slowness if: They are informed appropriately that an operation is pending. The user interface remains reactive at all time. Cheat whenever you can by first updating the UI and then do the work. Need to “lock” all or part of the user interface.
  • 5. Measuring performance Test performance using a setup similar to your users’ environment Profile your code during development Automate profiling/performance testing Keep historical records of how features perform Consider keeping some (small amount of) profiling code in production
  • 6. Part 2 High Performance Page Load
  • 7. Yahoo!'s Exceptional Performance rules Make Fewer HTTP Requests Use a Content Delivery Network Add an Expires Header Gzip Components (including JS!) Put CSS at the Top Move Scripts to the Bottom Avoid CSS Expressions Make JavaScript and CSS External Reduce DNS Lookups Minify JavaScript Avoid Redirects Remove Duplicate Scripts Configure ETags Make Ajax Cacheable See http://developer.yahoo.com/performance/ for more information. A web page works in 3 (sometimes imbricated) stages: load render run These rules cover mostly the first stage.
  • 8. Asset optimization Minify CSS and JavaScript files: Use the YUI Compressor [ http://developer.yahoo.com/yui/compressor/ ] Stay away from so-called advanced compression schemes - like Packer Combine CSS and JavaScript files: At build time [ http://www.julienlecomte.net/blog/2007/09/16/ ] At run time Optimize image assets: PngCrush [ http://pmt.sourceforge.net/pngcrush/ ] PngOptimizer [ http://psydk.org/PngOptimizer.php ] etc.
  • 9. Reduce unminified code size Loading and parsing HTML, CSS and JavaScript code is costly. Be concise and write less code. Make good use of JavaScript libraries. Consider splitting your large JavaScript files into smaller files (bundles) when the parsing and compilation of the script takes an excessive amount of time ( Firefox bug #313967 ) Load code (HTML, CSS and JavaScript) on demand (a.k.a “lazy loading”) See http://ajaxpatterns.org/On-Demand_Javascript Use the YUI Loader Dojo's package system JSAN Import System
  • 10. Optimize initial rendering (1/4) Miscellaneous tips... Consider rendering the first view on the server: Be aware of the added page weight You will still need to attach event handlers once the DOM is ready Close Your HTML Tags to Speed Up Parsing: Implicitly closed tags add cost to HTML parsing http://msdn2.microsoft.com/en-us/library/ms533020.aspx#Close_Your_Tags Consider flushing the apache buffer very early on: The download of external CSS files (should be at the top of the page!) may get a head start. May not influence the rendering speed however. Browsers buffer their input before displaying it. Load only essential assets / load assets on a delay or on demand Use the YUI Image Loader
  • 11. Optimize initial rendering (2/4) Don’t always wait for onload ... Most DOM operations can be accomplished before the onload event has fired. If you have control over where your code is going to be inserted in the page, write your init code in a <script> block located right before the closing </body> tag. Otherwise, use the YUI Event utility’s onDOMReady method: YAHOO.util.Event.onDOMReady( function () { // Do something here... // e.g., attach event handlers. });
  • 12. Optimize initial rendering (3/4) Post-load script loading A well designed site should be fully functional, even without JavaScript enabled. Therefore, you may be able to load scripts on a delay. Doing so benefits the loading of other assets (style sheets, images, etc.) Which makes your site load faster Right before the closing </body> tag, insert the following: <script> window.onload = function () { var script = document.createElement( &quot;script&quot; ); script.src = ...; document.body.appendChild(script); }; </script>
  • 13. Optimize initial rendering (4/4) Conditional preloading Preloading assets (JavaScript, CSS, Images, etc.) has the potential to really enhance the user experience. However, one must be smart about when the preloading takes place. Otherwise, the preloading may actually worsen the user experience... http://www.sitepoint.com/article/web-site-optimization-steps/3 Try it at http://search.yahoo.com/
  • 14. Part 3 High Performance JavaScript
  • 15. Reduce the amount of symbolic look-up: The scope chain (1/2) var g = 7 ; function f(a) { var v = 8 ; x = v + a + g; } f(6); parent Look-up is performed every time a variable is accessed. Variables are resolved backwards from most specific to least specific scope.
  • 16. Reduce the amount of symbolic look-up: The scope chain (2/2) Therefore, declare (with the var keyword) and use variables in the same scope whenever possible, and avoid global variables at all costs. Never use the with keyword, as it prevents the compiler from generating code for fast access to local variables (traverse the object prototype chain first, and then up the scope chain, and so on) Cache the result of expensive look-ups in local variables: var arr = ...; var globalVar = 0 ; ( function () { var i; for (i = 0 ; i < arr.length; i++) { globalVar++; } })(); var arr = ...; var globalVar = 0 ; ( function () { var i, l, localVar; l = arr.length; localVar = globalVar; for (i = 0 ; i < l; i++) { localVar++; } globalVar = localVar; })(); (faster on all A-grade browsers)
  • 17. Reduce the amount of symbolic look-up: The prototype chain function A () {} A.prototype.prop1 = ...; function B () { this .prop2 = ...; } B.prototype = new A(); var b = new B(); B.prototype Accessing members bound to the primary object is about 25% faster than accessing members defined anywhere in the prototype chain. The longer the traversal of the prototype chain, the slower the look-up.
  • 18. Optimize object instantiation If you need to create many objects, consider adding members to the prototype instead of adding them to each individual object in the object constructor (properties are bound once, to the prototype object) This also reduces memory consumption. However, it slows down the look-up of object members. function Foo () {...} Foo.prototype.bar = function () {...}; function Foo () { this .bar = function () {...}; }
  • 19. Don’t use eval ! The string passed to eval (and its relatives, the Function constructor and the setTimeout and setInterval functions) needs to be compiled and interpreted. Extremely slow! Never pass a string to the setTimeout and setInterval functions. Instead, pass an anonymous function like so: setTimeout( function () { // Code to execute on a timeout }, 50 ); Never use eval and the Function constructor (except in some extremely rare cases, and only in code blocks where performance is not critical)
  • 20. Optimize string concatenation On Internet Explorer (JScript), concatenating two strings causes a new string to be allocated, and the two original strings to be copied: var s = “xxx” + “yyy” ; s += “zzz” ; Therefore, it is much faster on Internet Explorer to append strings to an array, and then use Array.join (don’t use this for simple concatenations!) var i, s = “” ; for (i = 0 ; i < 10000 ; i++) { s += “x” ; } var i, s = []; for (i = 0 ; i < 10000 ; i++) { s[i] = “x” ; } s = s.join( “” ); Other JavaScript engines (WebKit, SpiderMonkey) have been optimized to handle string concatenations by doing a realloc + memcpy whenever possible. Use the YUI Compressor!
  • 21. Optimize regular expressions Don’t use the RegExp constructor, unless your regular expression is assembled at runtime. Instead, use regular expression literals. Use the test method if all you want to do is test for a pattern (the exec method carries a small performance penalty) Use non-capturing groups (?: ... ) Stick to simple patterns. If your regular expression looks like the following, reconsider... if ( /loaded|complete/ .test(document.readyState)) {...} (?:(?:)?[])*(?:(?:(?:[^()<>@,;:&quot;.00-31]+(?:(?:(?:)?[])+||(?=[&quot;()<>@,;:&quot;.]))|&quot; (?:[^amp;quot;]|.|(?:(?:)?[]))*&quot;(?:(?:)?[])*)(?:(?:(?:)?[])*(?:[^()<>@,;:&quot;.00-31 ]+(?:(?:(?:)?[])+||(?=[&quot;()<>@,;:&quot;.]))|&quot;(?:[^amp;quot;]|.|(?:(?:)?[]))*&quot;(?:(?:)?[]) *))*@(?:(?:)?[])*(?:[^()<>@,;:&quot;.00-31]+(?:(?:(?:)?[])+||(?=[&quot;()<>@,;:&quot;.]))| ([^]|.)*(?:(?:)?[])*)(?:(?:(?:)?[])*(?:[^()<>@,;:&quot;.00-31]+(?:(?:(?:)? [])+||(?=[&quot;()<>@,;:&quot;.]))|([^]|.)*(?:(?:)?[])*))*|(?:[^()<>@,;:&quot;.00- 31]+(?:(?:(?:)?[])+||(?=[&quot;()<>@,;:&quot;.]))|&quot;(?:[^amp;quot;]|.|(?:(?:)?[]))*&quot;(?:(?:)?[ ])*)*lt;(?:(?:)?[])*(?:@(?:[^()<>@,;:&quot;.00-31]+(?:(?:(?:)?[])+||(?=[&quot;()<>@,;:&quot;. ]))|([^]|.)*(?:(?:)?[])*)(?:(?:(?:)?[])*(?:[^()<>@,;:&quot;.00-31]+(?:(?:(?: )?[])+||(?=[&quot;()<>@,;:&quot;.]))|([^]|.)*(?:(?:)?[])*))*(?:,@(?:(?:)?[]))
  • 22. Caching Caching can be justified by: High cost (CPU or network latency) associated with getting a value Value will be read many times And will not change often! Increases memory consumption  tradeoff Memoization: var fn = ( function () { var b = false , v; return function () { if (!b) { v = ...; b = true ; } return v; }; })(); function fn () { if (!fn.b) { fn.v = ...; fn.b = true ; } return fn.v; } var fn = function () { var v = ...; return (fn = function () { return v; })(); }; Module pattern Store value in function object Lazy function definition
  • 23. How to handle long running JavaScript processes (1/2) During long running JavaScript processes, the entire browser UI is frozen Therefore, to maintain a decent user experience, make sure that JavaScript threads never take more than ~ 300 msec (at most) to complete. You can break long running processes into smaller units of work, and chain them using setTimeout . You can also process the data on the server. More info at http://www.julienlecomte.net/blog/2007/10/28 Demo
  • 24. How to handle long running JavaScript processes (2/2) function doSomething (callbackFn) { // Initialize a few things here... ( function () { // Do a little bit of work here... if ( termination condition ) { // We are done callbackFn(); } else { // Process next chunk setTimeout(arguments.callee, 0); } })(); }
  • 25. Miscellaneous tips (1/2) Primitive operations are often faster than the corresponding function calls: var a = 1 , b = 2 , c; c = Math.min(a, b); c = a < b ? a : b; If possible, avoid using try...catch in performance-critical sections: var i; for (i = 0 ; i < 100000 ; i++) { try { ... } catch (e) { ... } } var i; try { for (i = 0 ; i < 100000 ; i++) { ... } } catch (e) { ... } myArray.push(value); myArray[myArray.length] = value; myArray[idx++] = value;
  • 26. Miscellaneous tips (2/2) If possible, avoid for...in in performance-critical sections: var key, value; for (key in myArray) { value = myArray[key]; ... } var i, value, length = myArray.length; for (i = 0 ; i < length; i++) { value = myArray[i]; ... } Branch outside, not inside, whenever the branching condition does not change: function fn () { if (...) { ... } else { ... } } var fn; if (...) { fn = function () {...}; } else { fn = function () {...}; }
  • 27. Part 4 High Performance Dynamic HTML
  • 28. Document tree modification Using innerHTML var i, j, el, table, tbody, row, cell; el = document.createElement( &quot;div&quot; ); document.body.appendChild(el); table = document.createElement( &quot;table&quot; ); el.appendChild(table); tbody = document.createElement( &quot;tbody&quot; ); table.appendChild(tbody); for (i = 0 ; i < 1000 ; i++) { row = document.createElement( &quot;tr&quot; ); for (j = 0 ; j < 5 ; j++) { cell = document.createElement( &quot;td&quot; ); row.appendChild(cell); } tbody.appendChild(row); } var i, j, el, idx, html; idx = 0 ; html = []; html[idx++] = &quot;<table>&quot; ; for (i = 0 ; i < 1000 ; i++) { html[idx++] = &quot;<tr>&quot; ; for (j = 0 ; j < 5 ; j++) { html[idx++] = &quot;<td></td>&quot; ; } html[idx++] = &quot;</tr>&quot; ; } html[idx++] = &quot;</table>&quot; ; el = document.createElement( &quot;div&quot; ); document.body.appendChild(el); el.innerHTML = html.join( &quot;&quot; ); ( much faster on all A-grade browsers) Warning: See http://www.julienlecomte.net/blog/2007/12/38/
  • 29. Document tree modification Using cloneNode var i, j, el, table, tbody, row, cell; el = document.createElement( &quot;div&quot; ); document.body.appendChild(el); table = document.createElement( &quot;table&quot; ); el.appendChild(table); tbody = document.createElement( &quot;tbody&quot; ); table.appendChild(tbody); for (i = 0 ; i < 1000 ; i++) { row = document.createElement( &quot;tr&quot; ); for (j = 0 ; j < 5 ; j++) { cell = document.createElement( &quot;td&quot; ); row.appendChild(cell); } tbody.appendChild(row); } var i, el, table, tbody, template, row, cell; el = document.createElement( &quot;div&quot; ); document.body.appendChild(el); table = document.createElement( &quot;table&quot; ); el.appendChild(table); tbody = document.createElement( &quot;tbody&quot; ); table.appendChild(tbody); template = document.createElement( &quot;tr&quot; ); for (i = 0 ; i < 5 ; i++) { cell = document.createElement( &quot;td&quot; ); template.appendChild(cell); } for (i = 0 ; i < 1000 ; i++) { row = template.cloneNode(true); tbody.appendChild(row); } (faster on all A-grade browsers – sometimes much faster) Warning: expando properties/attached event handlers are lost!
  • 30. Document tree modification Using DocumentFragment A DocumentFragment (DOM Level 1 Core) is a lightweight Document object. It supports only a subset of the regular DOM methods and properties. IE’s implementation of the DocumentFragment interface does not comply with the W3C specification and returns a regular Document object. var i, j, el, table, tbody, row, cell, docFragment; docFragment = document.createDocumentFragment(); el = document.createElement( &quot;div&quot; ); docFragment.appendChild(el); table = document.createElement( &quot;table&quot; ); el.appendChild(table); tbody = document.createElement( &quot;tbody&quot; ); table.appendChild(tbody); for (i = 0 ; i < 1000 ; i++) { ... } document.body.appendChild(docFragment);
  • 31. Limit the number of event handlers (1/2) Attaching an event handler to hundreds of elements is very costly Multiplying event handlers augments the potential for memory leaks Solution: Use event delegation , a technique that relies on event bubbling <div id= &quot;container&quot; > <ul> <li id= &quot;li-1&quot; > List Item 1 </li> <li id= &quot;li-2&quot; > List Item 2 </li> <li id= &quot;li-3&quot; > List Item 3 </li> <li id= &quot;li-4&quot; > List Item 4 </li> <li id= &quot;li-5&quot; > List Item 5 </li> ... </ul> </div> div#container ul li#li- x text node
  • 32. Limit the number of event handlers (2/2) YAHOO.util.Event.addListener( &quot;container&quot; , &quot;click&quot; , function (e) { var el = YAHOO.util.Event.getTarget(e); while (el.id !== &quot;container&quot; ) { if (el.nodeName.toUpperCase() === &quot;LI&quot; ) { // Do something here... break; } else { el = el.parentNode; } } });
  • 33. Limiting reflows Reflows happen whenever the DOM tree is manipulated. Browsers have optimizations you may take advantage of to minimize reflow: Modifying an invisible element (display:none) does not trigger reflow Modifying an element “off-DOM” does not trigger reflow Batch style changes: Change the value of the style attribute using setAttribute (does not work on Internet Explorer) Example: Change the value of the cssText property of the style object. Example: More maintainable: Change the CSS class name of an element. Example: el.style.cssText = &quot;display:block;width:auto;height:100px;...&quot; ; YAHOO.util.Dom.replaceClass(el, &quot;foo&quot; , &quot;bar&quot; ); el.setAttribute( &quot;style&quot; , &quot;display:block;width:auto;height:100px;...&quot; );
  • 34. Miscellaneous tips... Consider using the onmousedown event instead of the onclick event Get a head start by making use of the small delay between the time a user presses the mouse button and the time he/she releases it. “ Downshift your code”: throttle frequent and expensive actions See http://yuiblog.com/blog/2007/07/09/downshift-your-code/
  • 35. Part 5 High Performance Layout and CSS
  • 36. Miscellaneous tips... Use CSS Sprites for Snappy Image Replacement. Avoid using JavaScript for layout. window.onresize is throttled... Use pure CSS instead! Side benefits: improves maintainability, degrades more gracefully, etc. Avoid using Internet Explorer expressions Expressions are constantly evaluated in order to react to environment changes. There are ways to more safely use expressions, but in general, you shouldn’t need/use them. Avoid using Internet Explorer filters (or keep their use to a minimum) Optimize Table Layout Goal: allow the rendering engine to start rendering a table before it has received all the data Use table-layout:fixed Explicitly define a COL element for each column Set the WIDTH attribute on each col Optimize your CSS selectors [ http://developer.mozilla.org/en/docs/Writing_Efficient_CSS ]
  • 37. Part 6 High Performance Ajax
  • 38. Ajax Best Practices Never resort to using synchronous XMLHttpRequest http://yuiblog.com/blog/2006/04/04/synchronous-v-asynchronous/ Asynchronous programming model slightly more complicated. Need to lock all or part of the UI while the transaction is pending. Programmatically handle network timeouts. Solution: Use the YUI Connection Manager: var callback = { success: function () { /* Do something */ }, failure: function () { /* Do something */ }, timeout: 5000 }; YAHOO.util.Connect.asyncRequest( &quot;GET&quot; , url, callback);
  • 39. Improving perceived network latency using the optimistic pattern If the data is validated locally (on the client, using JavaScript) before being sent to the server, the request will be successful in 99.9% of the cases. Therefore, in order to optimize the user experience, we should assume a successful outcome and adopt the following pattern: Update the UI when the request gets sent. Lock the UI/data structures with the finest possible granularity. Let the user know that something is happening. Let the user know why a UI object is locked. Unlock the UI/data structures when the outcome is successful. Handle error cases gracefully.
  • 40. Miscellaneous tips... Be aware of the maximum number of concurrent HTTP/1.1 connections. Multiplex Ajax requests whenever possible, and if your backend supports it. Piggyback unsollicited notifications in a response to an Ajax request. Favor JSON over XML as your data exchange format Accessing a JSON data structure is easier and cheaper than accessing XML data. JSON has less overhead than XML. Push, don’t poll. Use COMET to send real-time notifications to the browser. Consider using local storage to cache data locally, request a diff from the server: Internet Explorer’s userData Flash local storage DOM:Storage (WhatWG persistent storage API, implemented in Firefox 2) Google Gears etc.
  • 42. Performance Tools YSlow? [ http://developer.yahoo.com/yslow/ ] Task manager IE Leak Detector a.k.a Drip [ http://www.outofhanwell.com/ieleak/ ] Stopwatch profiling AjaxView [ http://research.microsoft.com/projects/ajaxview/ ] JsLex [ http://rockstarapps.com/pmwiki/pmwiki.php?n=JsLex.JsLex ] YUI profiler [ http://developer.yahoo.com/yui/profiler/ ] Venkman or Firebug Profiler [ http://www.getfirebug.com/ ]