Extreme JavaScript Performance

Thomas Fuchs
Thomas FuchsJavaScript Guru at Slash7
Extreme
JavaScript
Performance
Thomas Fuchs
@thomasfuchs
Extreme JavaScript Performance
DO NOT, EVER,
OPTIMIZE
PREMATURELY
http://tr.im/extremejs
Extreme JavaScript Performance
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
Extreme JavaScript Performance
Extreme JavaScript Performance
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();
Extreme JavaScript Performance
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
Extreme JavaScript Performance
DO NOT, EVER,
OPTIMIZE
PREMATURELY
Q&A
And thanks!
http://javascriptrocks.com/
@thomasfuchs on twitter
1 of 105

Recommended

Laravel の paginate は一体何をやっているのか by
Laravel の paginate は一体何をやっているのかLaravel の paginate は一体何をやっているのか
Laravel の paginate は一体何をやっているのかShohei Okada
15.2K views34 slides
PHP 8 と V8 (JavaScript) で速さを見比べてみよう! by
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!PHP 8 と V8 (JavaScript) で速さを見比べてみよう!
PHP 8 と V8 (JavaScript) で速さを見比べてみよう!shinjiigarashi
1.2K views64 slides
PHP AST 徹底解説 by
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説do_aki
26.4K views77 slides
Go入門 by
Go入門Go入門
Go入門Takuya Ueda
34.2K views131 slides
Format string Attack by
Format string AttackFormat string Attack
Format string Attackicchy
4.3K views61 slides
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」 by
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」Hiro H.
8.9K views71 slides

More Related Content

What's hot

PSR-1 と PSR-2 を 5分でざっくり理解する by
PSR-1 と PSR-2 を5分でざっくり理解するPSR-1 と PSR-2 を5分でざっくり理解する
PSR-1 と PSR-2 を 5分でざっくり理解するWataru Terada
17.7K views57 slides
アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect - by
アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect -アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect -
アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect -Naoki Nagazumi
22.8K views131 slides
PHP と SAPI と ZendEngine3 と by
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 とdo_aki
16.1K views95 slides
関数型プログラミングのデザインパターンひとめぐり by
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐりKazuyuki TAKASE
3K views15 slides
C/C++プログラマのための開発ツール by
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツールMITSUNARI Shigeo
13.8K views30 slides
Surviving the Java Deserialization Apocalypse // OWASP AppSecEU 2016 by
Surviving the Java Deserialization Apocalypse // OWASP AppSecEU 2016Surviving the Java Deserialization Apocalypse // OWASP AppSecEU 2016
Surviving the Java Deserialization Apocalypse // OWASP AppSecEU 2016Christian Schneider
7.7K views50 slides

What's hot(20)

PSR-1 と PSR-2 を 5分でざっくり理解する by Wataru Terada
PSR-1 と PSR-2 を5分でざっくり理解するPSR-1 と PSR-2 を5分でざっくり理解する
PSR-1 と PSR-2 を 5分でざっくり理解する
Wataru Terada17.7K views
アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect - by Naoki Nagazumi
アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect -アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect -
アプリ開発で知っておきたい認証技術 - OAuth 1.0 + OAuth 2.0 + OpenID Connect -
Naoki Nagazumi22.8K views
PHP と SAPI と ZendEngine3 と by do_aki
PHP と SAPI と ZendEngine3 とPHP と SAPI と ZendEngine3 と
PHP と SAPI と ZendEngine3 と
do_aki16.1K views
関数型プログラミングのデザインパターンひとめぐり by Kazuyuki TAKASE
関数型プログラミングのデザインパターンひとめぐり関数型プログラミングのデザインパターンひとめぐり
関数型プログラミングのデザインパターンひとめぐり
Kazuyuki TAKASE3K views
C/C++プログラマのための開発ツール by MITSUNARI Shigeo
C/C++プログラマのための開発ツールC/C++プログラマのための開発ツール
C/C++プログラマのための開発ツール
MITSUNARI Shigeo13.8K views
Surviving the Java Deserialization Apocalypse // OWASP AppSecEU 2016 by Christian Schneider
Surviving the Java Deserialization Apocalypse // OWASP AppSecEU 2016Surviving the Java Deserialization Apocalypse // OWASP AppSecEU 2016
Surviving the Java Deserialization Apocalypse // OWASP AppSecEU 2016
Christian Schneider7.7K views
Go1.18 Genericsを試す by asuka y
Go1.18 Genericsを試すGo1.18 Genericsを試す
Go1.18 Genericsを試す
asuka y454 views
WebAssemblyのWeb以外のことぜんぶ話す by Takaya Saeki
WebAssemblyのWeb以外のことぜんぶ話すWebAssemblyのWeb以外のことぜんぶ話す
WebAssemblyのWeb以外のことぜんぶ話す
Takaya Saeki28.2K views
php and sapi and zendengine2 and... by do_aki
php and sapi and zendengine2 and...php and sapi and zendengine2 and...
php and sapi and zendengine2 and...
do_aki5.9K views
The Odoo JS Framework by Odoo
The Odoo JS FrameworkThe Odoo JS Framework
The Odoo JS Framework
Odoo2.1K views
Engage 2019: Introduction to Node-Red by Paul Withers
Engage 2019: Introduction to Node-RedEngage 2019: Introduction to Node-Red
Engage 2019: Introduction to Node-Red
Paul Withers2.4K views
いまさら恥ずかしくてAsyncをawaitした by Kouji Matsui
いまさら恥ずかしくてAsyncをawaitしたいまさら恥ずかしくてAsyncをawaitした
いまさら恥ずかしくてAsyncをawaitした
Kouji Matsui6.5K views
型安全性入門 by Akinori Abe
型安全性入門型安全性入門
型安全性入門
Akinori Abe7.3K views
Android カスタムROMの作り方 by Masahiro Hidaka
Android カスタムROMの作り方Android カスタムROMの作り方
Android カスタムROMの作り方
Masahiro Hidaka41.7K views
Web API: The Good Parts 落穂ひろい by API Meetup
Web API: The Good Parts 落穂ひろいWeb API: The Good Parts 落穂ひろい
Web API: The Good Parts 落穂ひろい
API Meetup 17.2K views
Speed up web API with Laravel and Swoole using Docker by Laravel Poland MeetUp
Speed up web API with Laravel and Swoole using DockerSpeed up web API with Laravel and Swoole using Docker
Speed up web API with Laravel and Swoole using Docker
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要 by Akira Inoue
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
.NET 6 と Blazor で作るクロスプラットフォームアプリ概要
Akira Inoue896 views

Viewers also liked

Using jsPerf correctly by
Using jsPerf correctlyUsing jsPerf correctly
Using jsPerf correctlyMathias Bynens
26.7K views68 slides
jQuery Anti-Patterns for Performance & Compression by
jQuery Anti-Patterns for Performance & CompressionjQuery Anti-Patterns for Performance & Compression
jQuery Anti-Patterns for Performance & CompressionPaul Irish
25.2K views68 slides
High Performance Ajax Applications by
High Performance Ajax ApplicationsHigh Performance Ajax Applications
High Performance Ajax ApplicationsJulien Lecomte
56.7K views42 slides
iOS Coding Best Practices by
iOS Coding Best PracticesiOS Coding Best Practices
iOS Coding Best PracticesJean-Luc David
62.8K views46 slides
Know yourengines velocity2011 by
Know yourengines velocity2011Know yourengines velocity2011
Know yourengines velocity2011Demis Bellot
116.1K views192 slides
An Educators Guide to Podcasting and Broadcasting by @TeacherCast by
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
5.8K views83 slides

Viewers also liked(18)

Using jsPerf correctly by Mathias Bynens
Using jsPerf correctlyUsing jsPerf correctly
Using jsPerf correctly
Mathias Bynens26.7K views
jQuery Anti-Patterns for Performance & Compression by Paul Irish
jQuery Anti-Patterns for Performance & CompressionjQuery Anti-Patterns for Performance & Compression
jQuery Anti-Patterns for Performance & Compression
Paul Irish25.2K views
High Performance Ajax Applications by Julien Lecomte
High Performance Ajax ApplicationsHigh Performance Ajax Applications
High Performance Ajax Applications
Julien Lecomte56.7K views
iOS Coding Best Practices by Jean-Luc David
iOS Coding Best PracticesiOS Coding Best Practices
iOS Coding Best Practices
Jean-Luc David62.8K views
Know yourengines velocity2011 by Demis Bellot
Know yourengines velocity2011Know yourengines velocity2011
Know yourengines velocity2011
Demis Bellot116.1K views
An Educators Guide to Podcasting and Broadcasting by @TeacherCast by Jeffrey Bradbury
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
Jeffrey Bradbury5.8K views
India’s women bankers at the helm by eTailing India
India’s women bankers at the helmIndia’s women bankers at the helm
India’s women bankers at the helm
eTailing India299 views
ガチでビジネス DALIを使った照明制御 by Takahiro Nakahata
ガチでビジネス DALIを使った照明制御ガチでビジネス DALIを使った照明制御
ガチでビジネス DALIを使った照明制御
Takahiro Nakahata4.6K views
Samad Oraee - Learn More About Foot Pain by Samad Oraee
Samad Oraee - Learn More About Foot PainSamad Oraee - Learn More About Foot Pain
Samad Oraee - Learn More About Foot Pain
Samad Oraee120 views
Texto sobre la Consulta Previa/Conamaq-Cidob by somossur
Texto sobre la Consulta Previa/Conamaq-CidobTexto sobre la Consulta Previa/Conamaq-Cidob
Texto sobre la Consulta Previa/Conamaq-Cidob
somossur2.7K views
Boletín 08/03/2017 by Openbank
Boletín 08/03/2017Boletín 08/03/2017
Boletín 08/03/2017
Openbank84 views
Come creare e gestire campagne Google AdWords per E-Commerce | La settimana d... by Ruben Vezzoli
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 Vezzoli1.4K views

More from Thomas Fuchs

Zepto and the rise of the JavaScript Micro-Frameworks by
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
21.4K views87 slides
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K by
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
13.6K views39 slides
I Can't Believe It's Not Flash by
I Can't Believe It's Not FlashI Can't Believe It's Not Flash
I Can't Believe It's Not FlashThomas Fuchs
25K views48 slides
Prototype & Scriptaculous by
Prototype  & ScriptaculousPrototype  & Scriptaculous
Prototype & ScriptaculousThomas Fuchs
984 views63 slides
Textorize by
TextorizeTextorize
TextorizeThomas Fuchs
4.1K views38 slides
Adventures In JavaScript Testing by
Adventures In JavaScript TestingAdventures In JavaScript Testing
Adventures In JavaScript TestingThomas Fuchs
1.5K views62 slides

More from Thomas Fuchs(9)

Zepto and the rise of the JavaScript Micro-Frameworks by Thomas Fuchs
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
Thomas Fuchs21.4K views
Zepto.js, a jQuery-compatible mobile JavaScript framework in 2K by Thomas Fuchs
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
Thomas Fuchs13.6K views
I Can't Believe It's Not Flash by Thomas Fuchs
I Can't Believe It's Not FlashI Can't Believe It's Not Flash
I Can't Believe It's Not Flash
Thomas Fuchs25K views
Prototype & Scriptaculous by Thomas Fuchs
Prototype  & ScriptaculousPrototype  & Scriptaculous
Prototype & Scriptaculous
Thomas Fuchs984 views
Adventures In JavaScript Testing by Thomas Fuchs
Adventures In JavaScript TestingAdventures In JavaScript Testing
Adventures In JavaScript Testing
Thomas Fuchs1.5K views
Ruby On Rails Introduction by Thomas Fuchs
Ruby On Rails IntroductionRuby On Rails Introduction
Ruby On Rails Introduction
Thomas Fuchs57K views
Rich and Snappy Apps (No Scaling Required) by Thomas Fuchs
Rich and Snappy Apps (No Scaling Required)Rich and Snappy Apps (No Scaling Required)
Rich and Snappy Apps (No Scaling Required)
Thomas Fuchs7K views

Extreme JavaScript Performance