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

Time based CAPTCHA protected SQL injection through SOAP-webservice
Time based CAPTCHA protected SQL injection through SOAP-webserviceTime based CAPTCHA protected SQL injection through SOAP-webservice
Time based CAPTCHA protected SQL injection through SOAP-webserviceFrans Rosén
 
Approximation Data Structures for Streaming Applications
Approximation Data Structures for Streaming ApplicationsApproximation Data Structures for Streaming Applications
Approximation Data Structures for Streaming ApplicationsDebasish Ghosh
 
Functional Domain Modeling - The ZIO 2 Way
Functional Domain Modeling - The ZIO 2 WayFunctional Domain Modeling - The ZIO 2 Way
Functional Domain Modeling - The ZIO 2 WayDebasish Ghosh
 
WebSockets wiith Scala and Play! Framework
WebSockets wiith Scala and Play! FrameworkWebSockets wiith Scala and Play! Framework
WebSockets wiith Scala and Play! FrameworkFabio Tiriticco
 
Node.js File system & Streams
Node.js File system & StreamsNode.js File system & Streams
Node.js File system & StreamsEyal Vardi
 
Programación Funcional 101 con Scala y ZIO 2.0
Programación Funcional 101 con Scala y ZIO 2.0Programación Funcional 101 con Scala y ZIO 2.0
Programación Funcional 101 con Scala y ZIO 2.0Jorge Vásquez
 
RxJS Evolved
RxJS EvolvedRxJS Evolved
RxJS Evolvedtrxcllnt
 
[2019] 딥러닝을 이용한 가상 피팅 룸
[2019] 딥러닝을 이용한 가상 피팅 룸[2019] 딥러닝을 이용한 가상 피팅 룸
[2019] 딥러닝을 이용한 가상 피팅 룸NHN FORWARD
 
Acercándonos a la Programación Funcional a través de la Arquitectura Hexag...
Acercándonos a la Programación Funcional a través de la Arquitectura Hexag...Acercándonos a la Programación Funcional a través de la Arquitectura Hexag...
Acercándonos a la Programación Funcional a través de la Arquitectura Hexag...CodelyTV
 
JavaScript - Chapter 6 - Basic Functions
 JavaScript - Chapter 6 - Basic Functions JavaScript - Chapter 6 - Basic Functions
JavaScript - Chapter 6 - Basic FunctionsWebStackAcademy
 
성장을 좋아하는 사람이, 성장하고 싶은 사람에게
성장을 좋아하는 사람이, 성장하고 싶은 사람에게성장을 좋아하는 사람이, 성장하고 싶은 사람에게
성장을 좋아하는 사람이, 성장하고 싶은 사람에게Seongyun Byeon
 
The Terror-Free Guide to Introducing Functional Scala at Work
The Terror-Free Guide to Introducing Functional Scala at WorkThe Terror-Free Guide to Introducing Functional Scala at Work
The Terror-Free Guide to Introducing Functional Scala at WorkJorge Vásquez
 
Don’t Sacrifice Performance for Security: Best Practices for Content Delivery
Don’t Sacrifice Performance for Security: Best Practices for Content Delivery Don’t Sacrifice Performance for Security: Best Practices for Content Delivery
Don’t Sacrifice Performance for Security: Best Practices for Content Delivery Amazon Web Services
 
ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정Javajigi Jaesung
 
Chat application in java using swing and socket programming.
Chat application in java using swing and socket programming.Chat application in java using swing and socket programming.
Chat application in java using swing and socket programming.Kuldeep Jain
 
Haystack 2019 - Custom Solr Query Parser Design Option, and Pros & Cons - Ber...
Haystack 2019 - Custom Solr Query Parser Design Option, and Pros & Cons - Ber...Haystack 2019 - Custom Solr Query Parser Design Option, and Pros & Cons - Ber...
Haystack 2019 - Custom Solr Query Parser Design Option, and Pros & Cons - Ber...OpenSource Connections
 

La actualidad más candente (20)

Time based CAPTCHA protected SQL injection through SOAP-webservice
Time based CAPTCHA protected SQL injection through SOAP-webserviceTime based CAPTCHA protected SQL injection through SOAP-webservice
Time based CAPTCHA protected SQL injection through SOAP-webservice
 
Java I/O
Java I/OJava I/O
Java I/O
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Approximation Data Structures for Streaming Applications
Approximation Data Structures for Streaming ApplicationsApproximation Data Structures for Streaming Applications
Approximation Data Structures for Streaming Applications
 
Functional Domain Modeling - The ZIO 2 Way
Functional Domain Modeling - The ZIO 2 WayFunctional Domain Modeling - The ZIO 2 Way
Functional Domain Modeling - The ZIO 2 Way
 
Zippers
ZippersZippers
Zippers
 
WebSockets wiith Scala and Play! Framework
WebSockets wiith Scala and Play! FrameworkWebSockets wiith Scala and Play! Framework
WebSockets wiith Scala and Play! Framework
 
Node.js File system & Streams
Node.js File system & StreamsNode.js File system & Streams
Node.js File system & Streams
 
Programación Funcional 101 con Scala y ZIO 2.0
Programación Funcional 101 con Scala y ZIO 2.0Programación Funcional 101 con Scala y ZIO 2.0
Programación Funcional 101 con Scala y ZIO 2.0
 
RxJS Evolved
RxJS EvolvedRxJS Evolved
RxJS Evolved
 
[2019] 딥러닝을 이용한 가상 피팅 룸
[2019] 딥러닝을 이용한 가상 피팅 룸[2019] 딥러닝을 이용한 가상 피팅 룸
[2019] 딥러닝을 이용한 가상 피팅 룸
 
Acercándonos a la Programación Funcional a través de la Arquitectura Hexag...
Acercándonos a la Programación Funcional a través de la Arquitectura Hexag...Acercándonos a la Programación Funcional a través de la Arquitectura Hexag...
Acercándonos a la Programación Funcional a través de la Arquitectura Hexag...
 
JavaScript - Chapter 6 - Basic Functions
 JavaScript - Chapter 6 - Basic Functions JavaScript - Chapter 6 - Basic Functions
JavaScript - Chapter 6 - Basic Functions
 
성장을 좋아하는 사람이, 성장하고 싶은 사람에게
성장을 좋아하는 사람이, 성장하고 싶은 사람에게성장을 좋아하는 사람이, 성장하고 싶은 사람에게
성장을 좋아하는 사람이, 성장하고 싶은 사람에게
 
Models for hierarchical data
Models for hierarchical dataModels for hierarchical data
Models for hierarchical data
 
The Terror-Free Guide to Introducing Functional Scala at Work
The Terror-Free Guide to Introducing Functional Scala at WorkThe Terror-Free Guide to Introducing Functional Scala at Work
The Terror-Free Guide to Introducing Functional Scala at Work
 
Don’t Sacrifice Performance for Security: Best Practices for Content Delivery
Don’t Sacrifice Performance for Security: Best Practices for Content Delivery Don’t Sacrifice Performance for Security: Best Practices for Content Delivery
Don’t Sacrifice Performance for Security: Best Practices for Content Delivery
 
ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정ORM을 활용할 경우의 설계, 개발 과정
ORM을 활용할 경우의 설계, 개발 과정
 
Chat application in java using swing and socket programming.
Chat application in java using swing and socket programming.Chat application in java using swing and socket programming.
Chat application in java using swing and socket programming.
 
Haystack 2019 - Custom Solr Query Parser Design Option, and Pros & Cons - Ber...
Haystack 2019 - Custom Solr Query Parser Design Option, and Pros & Cons - Ber...Haystack 2019 - Custom Solr Query Parser Design Option, and Pros & Cons - Ber...
Haystack 2019 - Custom Solr Query Parser Design Option, and Pros & Cons - Ber...
 

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