SlideShare una empresa de Scribd logo
1 de 105
Descargar para leer sin conexión
Extreme
JavaScript
Performance
Thomas Fuchs
@thomasfuchs
DO NOT, EVER,
OPTIMIZE
PREMATURELY
http://tr.im/extremejs
SpiderMonkey
SpiderMonkey
JavaScriptCore
SpiderMonkey
JavaScriptCore
JScript
SpiderMonkey
JavaScriptCore
JScript
V8
#1
avoid function calls
function  methodCall(){
    function  square(n){  return  n*n  };
    var  i=10000,  sum  =  0;
    while(i-­‐-­‐)  sum  +=  square(i);
}
function  inlinedMethod(){  
    var  i=10000,  sum  =  0;
    while(i-­‐-­‐)  sum  +=  i*i;
}
function  methodCall(){
    function  square(n){  return  n*n  };
    var  i=10000,  sum  =  0;
    while(i-­‐-­‐)  sum  +=  square(i);
}
function  inlinedMethod(){  
    var  i=10000,  sum  =  0;
    while(i-­‐-­‐)  sum  +=  i*i;
}
function  methodCall(){
    function  square(n){  return  n*n  };
    var  i=10000,  sum  =  0;
    while(i-­‐-­‐)  sum  +=  square(i);
}
function  inlinedMethod(){  
    var  i=10000,  sum  =  0;
    while(i-­‐-­‐)  sum  +=  i*i;
}
methodCall() inlinedMethod()
0.410s 0.150s
0.056s 0.045s
uhm,  hmm† 0.128s
0.027s 0.016s
methodCall() inlinedMethod()
0.410s 0.150s
0.056s 0.045s
uhm,  hmm† 0.128s
0.027s 0.016s
methodCall() inlinedMethod()
0.410s 0.150s
0.056s 0.045s
uhm,  hmm† 0.128s
0.027s 0.016s
methodCall() inlinedMethod()
0.410s 0.150s
0.056s 0.045s
uhm,  hmm† 0.128s
0.027s 0.016s
methodCall() inlinedMethod()
0.410s 0.150s
0.056s 0.045s
uhm,  hmm† 0.128s
0.027s 0.016s
IE8 throws this warning
after 1 second
#2
embrace the
language
function  literals(){
    var  a  =  [],  o  =  {};
}
function  classic(){
    var  a  =  new  Array,  o  =  new  Object;
}
classic() literals()
0.291s 0.265s
0.020s 0.016s
0.220s 0.185s
0.024s 0.010s
classic() literals()
0.291s 0.265s
0.020s 0.016s
0.220s 0.185s
0.024s 0.010s
classic() literals()
0.291s 0.265s
0.020s 0.016s
0.220s 0.185s
0.024s 0.010s
classic() literals()
0.291s 0.265s
0.020s 0.016s
0.220s 0.185s
0.024s 0.010s
classic() literals()
0.291s 0.265s
0.020s 0.016s
0.220s 0.185s
0.024s 0.010s
>  parseInt(12.5);
12
>  ~~(1  *  "12.5")
12
1 * string coerces the
string into a float,
result = 12.5
double bitwise NOT*
floors the number
>  ~~(1  *  "12.5")
12
*good overview on http://tr.im/bitwise
parseInt() weird  stuff
0.003s 0.002s
0.088s 0.081s
uhm,  hmm† 0.547s
0.109s 0.282s
parseInt() weird  stuff
0.003s 0.002s
0.088s 0.081s
uhm,  hmm† 0.547s
0.109s 0.282s
parseInt() weird  stuff
0.003s 0.002s
0.088s 0.081s
uhm,  hmm† 0.547s
0.109s 0.282s
parseInt() weird  stuff
0.003s 0.002s
0.088s 0.081s
uhm,  hmm† 0.547s
0.109s 0.282s
parseInt() weird  stuff
0.003s 0.002s
0.088s 0.081s
uhm,  hmm† 0.547s
0.109s 0.282s
parseInt() weird  stuff
0.003s 0.002s
0.088s 0.081s
uhm,  hmm† 0.547s
0.109s 0.282s
Firefox is 30x faster
than Safari
#3
loops
var  test  =  '';
for  (var  i  =  0;i<10000;i++)
  test  =  test  +  str;
var  test  =  '',  i  =  10000;
while(i-­‐-­‐)  test  =  test  +  str;
for  loop while  loop
0.12s 0.12s
0.13s 0.13s
0.6s 0.6s
0.04s 0.04s
for  loop while  loop
0.12s 0.12s
0.13s 0.13s
0.6s 0.6s
0.04s 0.04s
for  loop while  loop
0.12s 0.12s
0.13s 0.13s
0.6s 0.6s
0.04s 0.04s
for  loop while  loop
0.12s 0.12s
0.13s 0.13s
0.6s 0.6s
0.04s 0.04s
for  loop while  loop
0.12s 0.12s
0.13s 0.13s
0.6s 0.6s
0.04s 0.04s
var  test  =  '';
for  (var  i  =  0;i<10000;i++)
  test  =  test  +  str;
var  test  =  '',  i  =  10000;
while(i-­‐-­‐)  test  =  test  +  str;
3 expressions in “for”
1 expression in “while”
(when i equals 0, expression will be false)
function  normalLoop(){
    var  i=60,  j=0;
    while(i-­‐-­‐)  j++;
}
function  unrolledLoop(){
    var  j=0;
    j++;  j++;  j++;  j++;  j++;  j++;  
    j++;  j++;  j++;  j++;  j++;  j++;
    j++;  j++;  j++;  j++;  j++;  j++;
    j++;  j++;  j++;  j++;  j++;  j++;
    j++;  j++;  j++;  j++;  j++;  j++;
    j++;  j++;  j++;  j++;  j++;  j++;
    j++;  j++;  j++;  j++;  j++;  j++;
    j++;  j++;  j++;  j++;  j++;  j++;
    j++;  j++;  j++;  j++;  j++;  j++;
    j++;  j++;  j++;  j++;  j++;  j++;
}
normalLoop() unrolledLoop()
0.023s 0.010s
0.003s 0.001s
0.032s 0.015s
0.005s 0.001s
normalLoop() unrolledLoop()
0.023s 0.010s
0.003s 0.001s
0.032s 0.015s
0.005s 0.001s
normalLoop() unrolledLoop()
0.023s 0.010s
0.003s 0.001s
0.032s 0.015s
0.005s 0.001s
normalLoop() unrolledLoop()
0.023s 0.010s
0.003s 0.001s
0.032s 0.015s
0.005s 0.001s
normalLoop() unrolledLoop()
0.023s 0.010s
0.003s 0.001s
0.032s 0.015s
0.005s 0.001s
#4
cache globals
function  uncached(){
    var  i  =  10000;
    while(i-­‐-­‐)  window.test  =  'test';
}
function  cached(){
    var  w  =  window,  i  =  10000;
    while(i-­‐-­‐)  w.test  =  'test';
}
uncached cached
1.440s 0.825s
0.07s 0.07s
2.22s 2.19s
0.48s 0.16s
uncached cached
1.440s 0.825s
0.07s 0.07s
2.22s 2.19s
0.48s 0.16s
uncached cached
1.440s 0.825s
0.07s 0.07s
2.22s 2.19s
0.48s 0.16s
uncached cached
1.440s 0.825s
0.07s 0.07s
2.22s 2.19s
0.48s 0.16s
uncached cached
1.440s 0.825s
0.07s 0.07s
2.22s 2.19s
0.48s 0.16s
uncached cached
1.440s 0.825s
0.07s 0.07s
2.22s 2.19s
0.48s 0.16s
Safari is 20x faster
than Firefox
uncached cached
1.440s 0.825s
0.07s 0.07s
2.22s 2.19s
0.48s 0.16s
Now IE works with >1s durations. WTF?
#5
expression tuning
var  b  =  false,  n  =  99;
function(){
    return  n*n  &&  b;
}
function(){
    return  b  &&  n*n;
}
var  b  =  false,  n  =  99;
function(){
    return  n*n  &&  b;
}
function(){
    return  b  &&  n*n;
} b is false,
so n*n doesn’t need
to get evaluated
not  tuned tuned
0.005s 0.004s
0.011s 0.010s
0.906s 0.391s
0.037s 0.021s
not  tuned tuned
0.005s 0.004s
0.011s 0.010s
0.906s 0.391s
0.037s 0.021s
not  tuned tuned
0.005s 0.004s
0.011s 0.010s
0.906s 0.391s
0.037s 0.021s
not  tuned tuned
0.005s 0.004s
0.011s 0.010s
0.906s 0.391s
0.037s 0.021s
not  tuned tuned
0.005s 0.004s
0.011s 0.010s
0.906s 0.391s
0.037s 0.021s
>>>  var  n  =  1;
undefined
>>>  if(true  &&  (n=2))  ...;
>>>  n
2
>>>  if(true  ||  (n=3))  ...;
>>>  n
2
not a pure engine optimization,
the execution actually stops
here, n=2 needs to
be evaluated,
so n is set to 2
here it doesn’t
(expression must
be true), so n is
NOT set to 3
#6
what not to use
function(){
    var  obj  =  {  prop:  'test',  str:  ''  };
    with(obj){  
        var  i  =  10000;
        while(i-­‐-­‐)  str  +=  prop;
        return  str;
    }
}
function(){
    var  obj  =  {  prop:  'test',  str:  ''  },  i  =  10000;
    while(i-­‐-­‐)  obj.str  +=  obj.prop;
    return  obj.str;
}
with(obj){  p  } obj.p
0.071s 0.012s
0.039s 0.028s
0.078s 0.078s
0.077s 0.006s
with(obj){  p  } obj.p
0.071s 0.012s
0.039s 0.028s
0.078s 0.078s
0.077s 0.006s
with(obj){  p  } obj.p
0.071s 0.012s
0.039s 0.028s
0.078s 0.078s
0.077s 0.006s
with(obj){  p  } obj.p
0.071s 0.012s
0.039s 0.028s
0.078s 0.078s
0.077s 0.006s
with(obj){  p  } obj.p
0.071s 0.012s
0.039s 0.028s
0.078s 0.078s
0.077s 0.006s
var  a  =  0;
function(){
    try{
        a  +=  1;
    }  catch(e)  {}
}
function(){
    a  +=  1;
}
try/catch no  try/catch
0.006s 0.005s
0.287s 0.011s
0.460s 0.460s
0.123s 0.012s
try/catch no  try/catch
0.006s 0.005s
0.287s 0.011s
0.460s 0.460s
0.123s 0.012s
try/catch no  try/catch
0.006s 0.005s
0.287s 0.011s
0.460s 0.460s
0.123s 0.012s
try/catch no  try/catch
0.006s 0.005s
0.287s 0.011s
0.460s 0.460s
0.123s 0.012s
try/catch no  try/catch
0.006s 0.005s
0.287s 0.011s
0.460s 0.460s
0.123s 0.012s
Firefox 3.5
Safari 4.0
Chrome 3
IE 8
0 0,1 0,2 0,3 0,4 0,5
no try/catch try/catch
Firefox 3.5
Safari 4.0
Chrome 3
IE 8
0 0,1 0,2 0,3 0,4 0,5
no try/catch try/catch
Firefox 3.5
Safari 4.0
Chrome 3
IE 8
0 0,1 0,2 0,3 0,4 0,5
no try/catch try/catch
Firefox 3.5
Safari 4.0
Chrome 3
IE 8
0 0,1 0,2 0,3 0,4 0,5
no try/catch try/catch
Firefox 3.5
Safari 4.0
Chrome 3
IE 8
0 0,1 0,2 0,3 0,4 0,5
no try/catch try/catch
Modern JavaScript
engines have JIT
compilers, which don’t
support certain
features well
Avoid stuff
that’s not
available in
ECMA-262
5th Edition
“strict” mode,
see John’s blog
post
Avoid stuff
that’s not
available in
ECMA-262
5th Edition
“strict” mode,
see John’s blog
post
http://tr.im/ecma262
alert((function(){return"alert
(("+arguments.callee.toString()
.replace(/s/g,"")+")());";})());
alert((function(){return"alert
(("+arguments.callee.toString()
.replace(/s/g,"")+")());";})());
(function(){  return  2  *  3;  }).toString();
function  ()  {  return  2  *  3;  }
function  ()  {  return  2  *  3;  }
function  ()  {  return  2  *  3;  }
function  ()  {  return  2  *  3;  }
function  ()  {  return  2  *  3;  }
function  ()  {  return  2  *  3;  }
function  ()  {  return  2  *  3;  }
function  ()  {  return  2  *  3;  }
function  ()  {  return  2  *  3;  }
function  ()  {  return  6;  }
function  ()  {  return  2  *  3;  }
function  ()  {  return  2  *  3;  }
function  ()  {  return  2  *  3;  }
function  ()  {  return  6;  } WTF?
More in
http://jsrocks.com
More in
http://jsrocks.com
DO NOT, EVER,
OPTIMIZE
PREMATURELY
Q&A
And thanks!
http://javascriptrocks.com/
@thomasfuchs on twitter

Más contenido relacionado

La actualidad más candente

Introduction to Sharding
Introduction to ShardingIntroduction to Sharding
Introduction to ShardingMongoDB
 
Introduction to Cascading Style Sheets (CSS)
Introduction to Cascading Style Sheets (CSS)Introduction to Cascading Style Sheets (CSS)
Introduction to Cascading Style Sheets (CSS)Chris Poteet
 
CSS3 Media Queries
CSS3 Media QueriesCSS3 Media Queries
CSS3 Media QueriesRuss Weakley
 
Apache Sqoop Tutorial | Sqoop: Import & Export Data From MySQL To HDFS | Hado...
Apache Sqoop Tutorial | Sqoop: Import & Export Data From MySQL To HDFS | Hado...Apache Sqoop Tutorial | Sqoop: Import & Export Data From MySQL To HDFS | Hado...
Apache Sqoop Tutorial | Sqoop: Import & Export Data From MySQL To HDFS | Hado...Edureka!
 
Introduction into ES6 JavaScript.
Introduction into ES6 JavaScript.Introduction into ES6 JavaScript.
Introduction into ES6 JavaScript.boyney123
 
Html5 tutorial for beginners
Html5 tutorial for beginnersHtml5 tutorial for beginners
Html5 tutorial for beginnersSingsys Pte Ltd
 
Entity Relationship Model
Entity Relationship ModelEntity Relationship Model
Entity Relationship ModelNeil Neelesh
 
ER Diagram- Cardinality.pptx
ER Diagram- Cardinality.pptxER Diagram- Cardinality.pptx
ER Diagram- Cardinality.pptxSCIENTIFICEARTH
 
Functional dependency and normalization
Functional dependency and normalizationFunctional dependency and normalization
Functional dependency and normalizationVisakh V
 
Zeppelin(Spark)으로 데이터 분석하기
Zeppelin(Spark)으로 데이터 분석하기Zeppelin(Spark)으로 데이터 분석하기
Zeppelin(Spark)으로 데이터 분석하기SangWoo Kim
 
Including Constraints -Oracle Data base
Including Constraints -Oracle Data base Including Constraints -Oracle Data base
Including Constraints -Oracle Data base Salman Memon
 

La actualidad más candente (20)

MySql slides (ppt)
MySql slides (ppt)MySql slides (ppt)
MySql slides (ppt)
 
Php
PhpPhp
Php
 
Cursors in MySQL
Cursors in MySQL Cursors in MySQL
Cursors in MySQL
 
Create table
Create tableCreate table
Create table
 
HTML
HTMLHTML
HTML
 
Introduction to Sharding
Introduction to ShardingIntroduction to Sharding
Introduction to Sharding
 
Introduction to Cascading Style Sheets (CSS)
Introduction to Cascading Style Sheets (CSS)Introduction to Cascading Style Sheets (CSS)
Introduction to Cascading Style Sheets (CSS)
 
CSS3 Media Queries
CSS3 Media QueriesCSS3 Media Queries
CSS3 Media Queries
 
Apache Sqoop Tutorial | Sqoop: Import & Export Data From MySQL To HDFS | Hado...
Apache Sqoop Tutorial | Sqoop: Import & Export Data From MySQL To HDFS | Hado...Apache Sqoop Tutorial | Sqoop: Import & Export Data From MySQL To HDFS | Hado...
Apache Sqoop Tutorial | Sqoop: Import & Export Data From MySQL To HDFS | Hado...
 
Introduction into ES6 JavaScript.
Introduction into ES6 JavaScript.Introduction into ES6 JavaScript.
Introduction into ES6 JavaScript.
 
Html5 tutorial for beginners
Html5 tutorial for beginnersHtml5 tutorial for beginners
Html5 tutorial for beginners
 
4.C#
4.C#4.C#
4.C#
 
Entity Relationship Model
Entity Relationship ModelEntity Relationship Model
Entity Relationship Model
 
Les03 Single Row Function
Les03 Single Row FunctionLes03 Single Row Function
Les03 Single Row Function
 
ER Diagram- Cardinality.pptx
ER Diagram- Cardinality.pptxER Diagram- Cardinality.pptx
ER Diagram- Cardinality.pptx
 
Functional dependency and normalization
Functional dependency and normalizationFunctional dependency and normalization
Functional dependency and normalization
 
HTML CSS Basics
HTML CSS BasicsHTML CSS Basics
HTML CSS Basics
 
Zeppelin(Spark)으로 데이터 분석하기
Zeppelin(Spark)으로 데이터 분석하기Zeppelin(Spark)으로 데이터 분석하기
Zeppelin(Spark)으로 데이터 분석하기
 
Including Constraints -Oracle Data base
Including Constraints -Oracle Data base Including Constraints -Oracle Data base
Including Constraints -Oracle Data base
 
CSS Positioning Elements.pdf
CSS Positioning Elements.pdfCSS Positioning Elements.pdf
CSS Positioning Elements.pdf
 

Destacado

Using jsPerf correctly
Using jsPerf correctlyUsing jsPerf correctly
Using jsPerf correctlyMathias Bynens
 
jQuery Anti-Patterns for Performance & Compression
jQuery Anti-Patterns for Performance & CompressionjQuery Anti-Patterns for Performance & Compression
jQuery Anti-Patterns for Performance & CompressionPaul Irish
 
High Performance Ajax Applications
High Performance Ajax ApplicationsHigh Performance Ajax Applications
High Performance Ajax ApplicationsJulien Lecomte
 
iOS Coding Best Practices
iOS Coding Best PracticesiOS Coding Best Practices
iOS Coding Best PracticesJean-Luc David
 
Know yourengines velocity2011
Know yourengines velocity2011Know yourengines velocity2011
Know yourengines velocity2011Demis Bellot
 
An Educators Guide to Podcasting and Broadcasting by @TeacherCast
An Educators Guide to Podcasting and Broadcasting by @TeacherCastAn Educators Guide to Podcasting and Broadcasting by @TeacherCast
An Educators Guide to Podcasting and Broadcasting by @TeacherCastJeffrey Bradbury
 
India’s women bankers at the helm
India’s women bankers at the helmIndia’s women bankers at the helm
India’s women bankers at the helmeTailing India
 
Modelo kata de competencia digital. isdi
Modelo kata de competencia digital. isdiModelo kata de competencia digital. isdi
Modelo kata de competencia digital. isdiFátima Gallo Martínez
 
ガチでビジネス DALIを使った照明制御
ガチでビジネス DALIを使った照明制御ガチでビジネス DALIを使った照明制御
ガチでビジネス DALIを使った照明制御Takahiro Nakahata
 
Samad Oraee - Learn More About Foot Pain
Samad Oraee - Learn More About Foot PainSamad Oraee - Learn More About Foot Pain
Samad Oraee - Learn More About Foot PainSamad Oraee
 
Texto sobre la Consulta Previa/Conamaq-Cidob
Texto sobre la Consulta Previa/Conamaq-CidobTexto sobre la Consulta Previa/Conamaq-Cidob
Texto sobre la Consulta Previa/Conamaq-Cidobsomossur
 
Boletín 08/03/2017
Boletín 08/03/2017Boletín 08/03/2017
Boletín 08/03/2017Openbank
 
Come creare e gestire campagne Google AdWords per E-Commerce | La settimana d...
Come creare e gestire campagne Google AdWords per E-Commerce | La settimana d...Come creare e gestire campagne Google AdWords per E-Commerce | La settimana d...
Come creare e gestire campagne Google AdWords per E-Commerce | La settimana d...Ruben Vezzoli
 

Destacado (18)

Using jsPerf correctly
Using jsPerf correctlyUsing jsPerf correctly
Using jsPerf correctly
 
jQuery Anti-Patterns for Performance & Compression
jQuery Anti-Patterns for Performance & CompressionjQuery Anti-Patterns for Performance & Compression
jQuery Anti-Patterns for Performance & Compression
 
High Performance Ajax Applications
High Performance Ajax ApplicationsHigh Performance Ajax Applications
High Performance Ajax Applications
 
iOS Coding Best Practices
iOS Coding Best PracticesiOS Coding Best Practices
iOS Coding Best Practices
 
Know yourengines velocity2011
Know yourengines velocity2011Know yourengines velocity2011
Know yourengines velocity2011
 
An Educators Guide to Podcasting and Broadcasting by @TeacherCast
An Educators Guide to Podcasting and Broadcasting by @TeacherCastAn Educators Guide to Podcasting and Broadcasting by @TeacherCast
An Educators Guide to Podcasting and Broadcasting by @TeacherCast
 
Al-Huda CIBE- 4th African Islamic Finance Summit
Al-Huda CIBE- 4th African Islamic Finance SummitAl-Huda CIBE- 4th African Islamic Finance Summit
Al-Huda CIBE- 4th African Islamic Finance Summit
 
Job interview techniques
Job interview techniques Job interview techniques
Job interview techniques
 
India’s women bankers at the helm
India’s women bankers at the helmIndia’s women bankers at the helm
India’s women bankers at the helm
 
Compliance
ComplianceCompliance
Compliance
 
Obama chronicles the book
Obama chronicles the bookObama chronicles the book
Obama chronicles the book
 
Modelo kata de competencia digital. isdi
Modelo kata de competencia digital. isdiModelo kata de competencia digital. isdi
Modelo kata de competencia digital. isdi
 
Turing machine
Turing  machine Turing  machine
Turing machine
 
ガチでビジネス DALIを使った照明制御
ガチでビジネス DALIを使った照明制御ガチでビジネス DALIを使った照明制御
ガチでビジネス DALIを使った照明制御
 
Samad Oraee - Learn More About Foot Pain
Samad Oraee - Learn More About Foot PainSamad Oraee - Learn More About Foot Pain
Samad Oraee - Learn More About Foot Pain
 
Texto sobre la Consulta Previa/Conamaq-Cidob
Texto sobre la Consulta Previa/Conamaq-CidobTexto sobre la Consulta Previa/Conamaq-Cidob
Texto sobre la Consulta Previa/Conamaq-Cidob
 
Boletín 08/03/2017
Boletín 08/03/2017Boletín 08/03/2017
Boletín 08/03/2017
 
Come creare e gestire campagne Google AdWords per E-Commerce | La settimana d...
Come creare e gestire campagne Google AdWords per E-Commerce | La settimana d...Come creare e gestire campagne Google AdWords per E-Commerce | La settimana d...
Come creare e gestire campagne Google AdWords per E-Commerce | La settimana d...
 

Más de Thomas Fuchs

Zepto and the rise of the JavaScript Micro-Frameworks
Zepto and the rise of the JavaScript Micro-FrameworksZepto and the rise of the JavaScript Micro-Frameworks
Zepto and the rise of the JavaScript Micro-FrameworksThomas Fuchs
 
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2KZepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2KThomas Fuchs
 
I Can't Believe It's Not Flash
I Can't Believe It's Not FlashI Can't Believe It's Not Flash
I Can't Believe It's Not FlashThomas Fuchs
 
Prototype & Scriptaculous
Prototype  & ScriptaculousPrototype  & Scriptaculous
Prototype & ScriptaculousThomas Fuchs
 
Adventures In JavaScript Testing
Adventures In JavaScript TestingAdventures In JavaScript Testing
Adventures In JavaScript TestingThomas Fuchs
 
Ruby On Rails Introduction
Ruby On Rails IntroductionRuby On Rails Introduction
Ruby On Rails IntroductionThomas Fuchs
 
Rich and Snappy Apps (No Scaling Required)
Rich and Snappy Apps (No Scaling Required)Rich and Snappy Apps (No Scaling Required)
Rich and Snappy Apps (No Scaling Required)Thomas Fuchs
 

Más de Thomas Fuchs (9)

Zepto and the rise of the JavaScript Micro-Frameworks
Zepto and the rise of the JavaScript Micro-FrameworksZepto and the rise of the JavaScript Micro-Frameworks
Zepto and the rise of the JavaScript Micro-Frameworks
 
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2KZepto.js, a jQuery-compatible mobile JavaScript framework in 2K
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K
 
I Can't Believe It's Not Flash
I Can't Believe It's Not FlashI Can't Believe It's Not Flash
I Can't Believe It's Not Flash
 
Prototype & Scriptaculous
Prototype  & ScriptaculousPrototype  & Scriptaculous
Prototype & Scriptaculous
 
Textorize
TextorizeTextorize
Textorize
 
Adventures In JavaScript Testing
Adventures In JavaScript TestingAdventures In JavaScript Testing
Adventures In JavaScript Testing
 
Ruby On Rails Introduction
Ruby On Rails IntroductionRuby On Rails Introduction
Ruby On Rails Introduction
 
Twistori Tech
Twistori TechTwistori Tech
Twistori Tech
 
Rich and Snappy Apps (No Scaling Required)
Rich and Snappy Apps (No Scaling Required)Rich and Snappy Apps (No Scaling Required)
Rich and Snappy Apps (No Scaling Required)
 

Extreme JavaScript Performance