SlideShare une entreprise Scribd logo
1  sur  82
Télécharger pour lire hors ligne
Performance Patterns




Stoyan Stefanov
JSConfEU
Berlin, 2010
http://slideshare.net/stoyan/
About me
           YSlow 2.0
Lies,
      damn lies,
and performance advise
On the agenda
1.  Understanding the problem
2.  Some pointers/patterns
Moving targets
Moving targets
•  Browsers
•  Libraries


•  e.g. IE string concatenation
+= or array.join()
var res = '',	        var res = [],	
    count = 10000;	       count = 10000;	
while (count--) {	    while (count--) {	
 res += 'a';	          res.push('a');	
}	                    }	

                      res = res.join('');	



              http://jsperf.com/join-concat/
“The Pen is mightier
       than the Sword” *

* only if the Sword is very small
   and the Pen very sharp
Benchmarks
Commonly…
var start = new Date();	
// ... go crazy ...	
var took = new Date() – start;
But…
•  Releasing the thread?
•  Updating the page?
•  In-memory DOM
  operations?
Better…
var start = new Date();	
// ... go crazy ...	
setTimeout(function () {	
    var took = new Date() – start;   	
}, 0);
Zero timeout
•  15 ms in IE
•  10 in FF, Safari
•  4 in Chrome
When benchmarking…
1.  Long enough operations
    (much longer than 15ms)
2.  200 runs for statistical
    significance
3.  Filtering outliers
4.  0-timeout end time
Results
•  Average
•  Median
•  Throw < 25% and >75%
Quarters


   ¼       ¼          ¼    ¼

 Garbage       Data       Garbage
Benchmarks
•  No need to benchmark
   browsers
•  Time values not important
•  Question is: given A and B,
   which way to go? Really?
   All the time?
JSPerf.com
•  Type in a form
•  Test, compare browsers
•  Community
How about real life?
Picking the battles
Speeding Up
Speeding Up
1.  Loading
2.  Running
Speeding Up
1.  Loading
2.  Running
Loading – the basics
•  Reducing the # scripts
•  Gzip
•  Minification
•  Expires
•  CDN
Loading asynchronously
•  Async === Good
•  Progress
•  Perception
JavaScript blocks



   html
          js
               png

               png
JavaScript at the bottom



   html
          png

          png

                js
Non-blocking JavaScript
•  defer and async	
•  Defer: IE innovation, ok to
   delay, but keep order
•  Async: HTML5, whatever
<script async src="my.js" onload="doIt()"></script> 
<script defer src="my.js" onload="doIt()"></script> 
defer and async timeline

               async
                   	


     defer
         	



         DOMContentLoaded
                        	   load
Non-blocking JavaScript
•    Asynchronous JavaScript
     html
                  js

            png

            png


var js = document.createElement('script'); 
js.src = 'myscript.js'; 
var h = document.getElementsByTagName('head')[0]; 
h.appendChild(js); 
flush() early
 html
                         png

                    js               
                               css



 html



   js
        png
                                     ✔
              css
flush()
<html>	
<head>	
  <script src="my.js" 	
   	type="text/javascript"></script>	
  <link href="my.css" 	
   	type="text/css" rel="stylesheet" />	
</head>	

<?php flush() ?>
<body>	
  ....
Progressive rendering
                         Chunk
                         #1




                         Chunk
                         #2




x.appendChild(script)	   Chunk
                         #3
<!doctype html>	
<html>	
<head><title>My App</title></head>	
<body>	
  <div id="header">	
     <img src="logo.png" />	
     ...	
  </div>                   <!-- end of chunk #1 -->	

  ... The full body of the page ...	
                           <!-- end of chunk #2 -->	



<script src="all_20100925.js"></script>	
</body>	
</html>                    <!-- end of chunk #3 -->
Script injection patterns
document.getElementsByTagName("head")[0]	
    .appendChild(script);	

document.documentElement.firstChild	
   	.appendChild(script);	

document.body.appendChild(script);	

var first_script = document	
    .getElementsByTagName('script')[0];	
first_script.parentNode	
    .insertBefore(script, first_script);
HTTP chunking: not only HTML
HTTP chunking: not only HTML
•  Google Instant
•  /*""*/ - delimited JSON
   pieces, MXHR anyone?
•  Chunk #1 suggestions
•  Chunk #2 results

                    http://tinyurl.com/chunkview
Moar HTML5 attributes
•    ping="http://stats…"	
•    prefetch="http://later…"
Preload sans execute
var preload; 	
if (/*@cc_on!@*/false) { // IE 	
    preload = function (file) {	
        new Image().src = file;	
    };	
} else {	
    preload = function (file) {	
        var obj = document.createElement('object'),	
            body = document.body;	
        obj.width = 0;	
        obj.height = 0;	
        obj.data = file;	
        body.appendChild(obj);	
    };	
}
Speeding Up
1.  Loading
2.  Running
Runtime performance
1.  Going local
2.  Reusing
       aka caching, aka DRY
Runtime performance
1.  Going local
2.  Reusing
Local variables

•  globals are all sorts of bad
•  use var 
•  localize globals
Local variables
var a = 1; 	
(function (){	
  var a = 2; 	
  function b(){	
     var a = 3; 	
     alert(a);	
  }	
  b(); 	
})(); // 3
Local variables
var a = 1; 	
(function (){	
  var a = 2; 	
  function b(){	
     // var a = 3; 	
     alert(a);	
  }	
  b(); 	
})(); // 2
Local variables
var a = 1; 	
(function (){	
  // var a = 2; 	
  function b(){	
     // var a = 3; 	
     alert(a);	
  }	
  b(); 	
})(); // 1
Local variables

•  less crawling up the scope
chain
•  helps minification
Localization
var mamodule = (function () {	

  window...	
  document...	
  otherModule...   	

}());
Localization
var mamodule = (function (g, d, om)
{	

  g... // global	
  d... // document reference	
  om... // another common module	

}(this, document, otherModule));
Runtime performance
1.  Going local
2.  Reusing, aka caching
Init-time branching
•  Before… 
function myEvent(el, type, fn) {	
     if (window.addEventListener) {	
       el.addEventListener(type, fn, false);	
  } else if (window.attachEvent) {	
       el.attachEvent("on" + type, fn);	
  } else {...	
}
Init-time branching
•  After… 
if (window.addEventListener) {	
     var myEvent = function (el, type, fn) {	
       el.addEventListener(type, fn, false);	
  }	
} else if (window.attachEvent) {	
  var myEvent = function (el, type, fn) {	
       el.attachEvent("on" + type, fn);	
  }	
}
Memoization
•  for expensive, repeating tasks

function myFunc(param){	
    if (!myFunc.cache) {	
        myFunc.cache = {};	
    }	
    if (!myFunc.cache[param]) {	
        var result = {}; // ...	
        myFunc.cache[param] = result;	
    }	
    return myFunc.cache[param];	
}
Memoization – other options
•  in a closure
•  offline
Classical       inheritance
•  Before…

var inherit = function (C, P) {	
  var F = function () {};	
  F.prototype = P.prototype;	
  C.prototype = new F();	
  C.uber = P.prototype;	
  C.prototype.constructor = C;	
};
Classical        inheritance
•  After…

var inherit = (function () {	
  var F = function () {};	
  return function (C, P) {	
     F.prototype = P.prototype;	
     C.prototype = new F();	
     C.uber = P.prototype;	
     C.prototype.constructor = C;	
  }	
}());	
                 http://jsperf.com/holy-grail-classical-reuse
Regex loops
•  Before…

var i = 1000,	
    dude;	

while (i--) {	
    dude = /[a-z]/.test('duderino');	
};
Regex loops
•  After…

var i = 1000,	
    dude, 	
    re = /[a-z]/;	

while (i--) {	
    dude = re.test('duderino');	
}	



                          http://jsperf.com/regexp-loops
Cashing lengths in loops
•  before…

var a = [];	

for (var i = 0; i < a.length; i++) {	
    console.log(a[i]);	
}
Cashing lengths in loops
•  later…

var a = [], 	
    i = 0;	

for (; i < a.length; i += 1) {	
    console.log(a[i]);	
}
Cashing lengths in loops
•  after…

var a = [], 	
    i = 0,	
    len = a.length;	

for (; i < len; i += 1) {	
    console.log(a[i]);	
}
Cashing lengths in loops
•  alternatively…

var a = [], 	
   i = a.length;	

while (i--) {	
    console.log(a[i]);	
}
DOM
DOM – case A
// bad 	
var count = 0;	
for (; count < 15000; count += 1) {	

     document.getElementById('here').innerHTML += 'a'; 	

}	

// DOM access = (1 get + 1 set) * 15000
DOM – case B
// better	
var count = 0, content = ''; 	
for (; count < 15000; count += 1) {	

    content += 'a'; 	

}	
document.getElementById('here').innerHTML += content;	

// DOM access: get + set
IE 6


        IE 7


        IE 8


  Firefox 3


 Firefox 3.5


 Safari 3.2


   Safari 4


 Chrome 2


 Chrome 3


Opera 9.64
               How bad is A compared to B?




 Opera 10
ECMAland   DOMland
DOM is slow
Proxy Design Pattern
Proxy pattern
•  One object acts as an
  interface to another
Proxy pattern
Proxy pattern
Proxy pattern
Proxy pattern
Words of Wisdom
•  Ask why? How?
•  Load quickly and async
•  Don’t touch the DOM
•  Go local
Thank you!


Stoyan Stefanov
@stoyanstefanov
http://www.phpied.com

Contenu connexe

Tendances

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
Thomas Fuchs
 
Appsec usa2013 js_libinsecurity_stefanodipaola
Appsec usa2013 js_libinsecurity_stefanodipaolaAppsec usa2013 js_libinsecurity_stefanodipaola
Appsec usa2013 js_libinsecurity_stefanodipaola
drewz lin
 
Apache CouchDB talk at Ontario GNU Linux Fest
Apache CouchDB talk at Ontario GNU Linux FestApache CouchDB talk at Ontario GNU Linux Fest
Apache CouchDB talk at Ontario GNU Linux Fest
Myles Braithwaite
 
Ajax Performance Tuning and Best Practices
Ajax Performance Tuning and Best PracticesAjax Performance Tuning and Best Practices
Ajax Performance Tuning and Best Practices
Doris Chen
 
kissy-past-now-future
kissy-past-now-futurekissy-past-now-future
kissy-past-now-future
yiming he
 

Tendances (20)

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
 
Building High Performance Web Applications and Sites
Building High Performance Web Applications and SitesBuilding High Performance Web Applications and Sites
Building High Performance Web Applications and Sites
 
ES6 is Nigh
ES6 is NighES6 is Nigh
ES6 is Nigh
 
From Node to Go
From Node to GoFrom Node to Go
From Node to Go
 
Testing Web Applications with GEB
Testing Web Applications with GEBTesting Web Applications with GEB
Testing Web Applications with GEB
 
Appsec usa2013 js_libinsecurity_stefanodipaola
Appsec usa2013 js_libinsecurity_stefanodipaolaAppsec usa2013 js_libinsecurity_stefanodipaola
Appsec usa2013 js_libinsecurity_stefanodipaola
 
JavaScript Promise
JavaScript PromiseJavaScript Promise
JavaScript Promise
 
Apache CouchDB talk at Ontario GNU Linux Fest
Apache CouchDB talk at Ontario GNU Linux FestApache CouchDB talk at Ontario GNU Linux Fest
Apache CouchDB talk at Ontario GNU Linux Fest
 
Ajax Performance Tuning and Best Practices
Ajax Performance Tuning and Best PracticesAjax Performance Tuning and Best Practices
Ajax Performance Tuning and Best Practices
 
The promise of asynchronous PHP
The promise of asynchronous PHPThe promise of asynchronous PHP
The promise of asynchronous PHP
 
HTML5: where flash isn't needed anymore
HTML5: where flash isn't needed anymoreHTML5: where flash isn't needed anymore
HTML5: where flash isn't needed anymore
 
Django Heresies
Django HeresiesDjango Heresies
Django Heresies
 
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
Callbacks, Promises, and Coroutines (oh my!): Asynchronous Programming Patter...
 
KISSY 的昨天、今天与明天
KISSY 的昨天、今天与明天KISSY 的昨天、今天与明天
KISSY 的昨天、今天与明天
 
kissy-past-now-future
kissy-past-now-futurekissy-past-now-future
kissy-past-now-future
 
NoSQL & MongoDB
NoSQL & MongoDBNoSQL & MongoDB
NoSQL & MongoDB
 
"The little big project. From zero to hero in two weeks with 3 front-end engi...
"The little big project. From zero to hero in two weeks with 3 front-end engi..."The little big project. From zero to hero in two weeks with 3 front-end engi...
"The little big project. From zero to hero in two weeks with 3 front-end engi...
 
performance vamos dormir mais?
performance vamos dormir mais?performance vamos dormir mais?
performance vamos dormir mais?
 
Testing Backbone applications with Jasmine
Testing Backbone applications with JasmineTesting Backbone applications with Jasmine
Testing Backbone applications with Jasmine
 
History of jQuery
History of jQueryHistory of jQuery
History of jQuery
 

Similaire à Performance patterns

#NewMeetup Performance
#NewMeetup Performance#NewMeetup Performance
#NewMeetup Performance
Justin Cataldo
 
the next web now
the next web nowthe next web now
the next web now
zulin Gu
 
Progressive downloads and rendering (Stoyan Stefanov)
Progressive downloads and rendering (Stoyan Stefanov)Progressive downloads and rendering (Stoyan Stefanov)
Progressive downloads and rendering (Stoyan Stefanov)
Ontico
 
Enhance Web Performance
Enhance Web PerformanceEnhance Web Performance
Enhance Web Performance
Adam Lu
 
Web Performance Workshop - Velocity London 2013
Web Performance Workshop - Velocity London 2013Web Performance Workshop - Velocity London 2013
Web Performance Workshop - Velocity London 2013
Andy Davies
 
Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)
Remy Sharp
 

Similaire à Performance patterns (20)

JavaScript performance patterns
JavaScript performance patternsJavaScript performance patterns
JavaScript performance patterns
 
JavaScript Performance Patterns
JavaScript Performance PatternsJavaScript Performance Patterns
JavaScript Performance Patterns
 
#NewMeetup Performance
#NewMeetup Performance#NewMeetup Performance
#NewMeetup Performance
 
Progressive Downloads and Rendering
Progressive Downloads and RenderingProgressive Downloads and Rendering
Progressive Downloads and Rendering
 
the next web now
the next web nowthe next web now
the next web now
 
Progressive downloads and rendering (Stoyan Stefanov)
Progressive downloads and rendering (Stoyan Stefanov)Progressive downloads and rendering (Stoyan Stefanov)
Progressive downloads and rendering (Stoyan Stefanov)
 
Lecture 03 - JQuery.pdf
Lecture 03 - JQuery.pdfLecture 03 - JQuery.pdf
Lecture 03 - JQuery.pdf
 
Make BDD great again
Make BDD great againMake BDD great again
Make BDD great again
 
Performance Optimization and JavaScript Best Practices
Performance Optimization and JavaScript Best PracticesPerformance Optimization and JavaScript Best Practices
Performance Optimization and JavaScript Best Practices
 
Nodejs - A quick tour (v6)
Nodejs - A quick tour (v6)Nodejs - A quick tour (v6)
Nodejs - A quick tour (v6)
 
Enhance Web Performance
Enhance Web PerformanceEnhance Web Performance
Enhance Web Performance
 
Web Performance Workshop - Velocity London 2013
Web Performance Workshop - Velocity London 2013Web Performance Workshop - Velocity London 2013
Web Performance Workshop - Velocity London 2013
 
Node.js flow control
Node.js flow controlNode.js flow control
Node.js flow control
 
Run Node Run
Run Node RunRun Node Run
Run Node Run
 
introduction to node.js
introduction to node.jsintroduction to node.js
introduction to node.js
 
JS Essence
JS EssenceJS Essence
JS Essence
 
Unit Testing JavaScript Applications
Unit Testing JavaScript ApplicationsUnit Testing JavaScript Applications
Unit Testing JavaScript Applications
 
Javascript first-class citizenery
Javascript first-class citizeneryJavascript first-class citizenery
Javascript first-class citizenery
 
Beyond Cookies, Persistent Storage For Web Applications Web Directions North ...
Beyond Cookies, Persistent Storage For Web Applications Web Directions North ...Beyond Cookies, Persistent Storage For Web Applications Web Directions North ...
Beyond Cookies, Persistent Storage For Web Applications Web Directions North ...
 
Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)Is HTML5 Ready? (workshop)
Is HTML5 Ready? (workshop)
 

Plus de Stoyan Stefanov

JavaScript shell scripting
JavaScript shell scriptingJavaScript shell scripting
JavaScript shell scripting
Stoyan Stefanov
 
JavaScript for PHP developers
JavaScript for PHP developersJavaScript for PHP developers
JavaScript for PHP developers
Stoyan Stefanov
 

Plus de Stoyan Stefanov (20)

Reactive JavaScript
Reactive JavaScriptReactive JavaScript
Reactive JavaScript
 
YSlow hacking
YSlow hackingYSlow hacking
YSlow hacking
 
Liking performance
Liking performanceLiking performance
Liking performance
 
High Performance Social Plugins
High Performance Social PluginsHigh Performance Social Plugins
High Performance Social Plugins
 
Social Button BFFs
Social Button BFFsSocial Button BFFs
Social Button BFFs
 
JavaScript навсякъде
JavaScript навсякъдеJavaScript навсякъде
JavaScript навсякъде
 
JavaScript is everywhere
JavaScript is everywhereJavaScript is everywhere
JavaScript is everywhere
 
JavaScript shell scripting
JavaScript shell scriptingJavaScript shell scripting
JavaScript shell scripting
 
JavaScript for PHP developers
JavaScript for PHP developersJavaScript for PHP developers
JavaScript for PHP developers
 
WPO @ PubCon 2010
WPO @ PubCon 2010WPO @ PubCon 2010
WPO @ PubCon 2010
 
Progressive Downloads and Rendering - take #2
Progressive Downloads and Rendering - take #2Progressive Downloads and Rendering - take #2
Progressive Downloads and Rendering - take #2
 
Voices that matter: High Performance Web Sites
Voices that matter: High Performance Web SitesVoices that matter: High Performance Web Sites
Voices that matter: High Performance Web Sites
 
Psychology of performance
Psychology of performancePsychology of performance
Psychology of performance
 
3-in-1 YSlow
3-in-1 YSlow3-in-1 YSlow
3-in-1 YSlow
 
CSS and image optimization
CSS and image optimizationCSS and image optimization
CSS and image optimization
 
High-performance DOM scripting
High-performance DOM scriptingHigh-performance DOM scripting
High-performance DOM scripting
 
The business of performance
The business of performanceThe business of performance
The business of performance
 
JavaScript Patterns
JavaScript PatternsJavaScript Patterns
JavaScript Patterns
 
Ignite Velocity: Image Weight Loss Clinic
Ignite Velocity: Image Weight Loss ClinicIgnite Velocity: Image Weight Loss Clinic
Ignite Velocity: Image Weight Loss Clinic
 
Don't make me wait! or Building High-Performance Web Applications
Don't make me wait! or Building High-Performance Web ApplicationsDon't make me wait! or Building High-Performance Web Applications
Don't make me wait! or Building High-Performance Web Applications
 

Dernier

Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
Joaquim Jorge
 

Dernier (20)

presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
Advantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your BusinessAdvantages of Hiring UIUX Design Service Providers for Your Business
Advantages of Hiring UIUX Design Service Providers for Your Business
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 

Performance patterns