SlideShare a Scribd company logo
1 of 36
Tips from the Trenches:
Gating Performance
James English
• Web technologies > 15 years
• Spent 7 of those at IG
• Focus on performant web applications
Who are IG?
Overview of platform
Deep Dive: Memory Leaks
Monitoring Metrics
Demo
1
2
3
4
Agenda
• ~40 developers worked on codebase
• Agile environment
• Release Intraday
• Post release checks on critical paths
Recap: What is a memory leak?
Memory Lifecycle
Recap: What is a memory leak?
Credit: Alexander Zlatkov
Recap: What is a memory leak?
Why do leaks matter?
• Low end devices
• Degrades performance of application over time
• May impact your heaviest users the most
• Reputation can be affected
Debugging a memory leak
Debugging a memory leak
Debugging a memory leak:
Task Manager
Debugging a memory leak:
Task Manager
Debugging a memory leak:
Performance Timeline
Debugging a memory leak:
Memory snapshots
Chrome APIs
window.performance.memory
- jsHeapSizeLimit
JavaScript heap limit.
- totalJSHeapSize
JavaScript heap has allocated including free space.
- usedJSHeapSize
Memory currently being used.
Example:
{
jsHeapSizeLimit: 767557632,
totalJSHeapSize: 58054528,
usedJSHeapSize: 42930044
}
Proprietary API
Chrome Flags
--expose-gc
Js flag to expose garbage collection programmatically
Measuring memory usage
• Visit application URL in Chrome
--expose-gc
• Perform garbage collection
• Take initial memory snapshot
window.performance.memory.usedJSHeapSize
• Perform action a set number of times
• Perform garbage collection
• Take another snapshot and subtract initial snapshot
Measuring memory usage
What about gating it???
Preventing memory leaks
Takeaways
• Understanding memory leaks
• What a memory leak is?
• Debugging
• Measuring retained memory to get visibility
• Automate executing a UI action and measuring the memory retained.
• Storing over time to monitor any memory leaks.
• Preventing memory leaks by gating
• Writing tests to assert retained memory is below a given threshold.
• Frame rate – ticking prices
• Rendering times – components
Other monitoring
Wooo!
Thankyou!
Twitter:
@jimenglish81
Github:
https://github.com/jimenglish81/memory-leak-test

More Related Content

What's hot

What's hot (16)

The benefits of using an APM solution while performance testing
The benefits of using an APM solution while performance testingThe benefits of using an APM solution while performance testing
The benefits of using an APM solution while performance testing
 
Continuous Integration
Continuous IntegrationContinuous Integration
Continuous Integration
 
Client side production monitoring using - SyncApp Tool
Client side production monitoring using - SyncApp ToolClient side production monitoring using - SyncApp Tool
Client side production monitoring using - SyncApp Tool
 
Enforcing code guidelines by extending JDeveloper’s auditing framework @OOW14
Enforcing code guidelines by extending JDeveloper’s auditing framework @OOW14Enforcing code guidelines by extending JDeveloper’s auditing framework @OOW14
Enforcing code guidelines by extending JDeveloper’s auditing framework @OOW14
 
OWASP DefectDojo - Open Source Security Sanity
OWASP DefectDojo - Open Source Security SanityOWASP DefectDojo - Open Source Security Sanity
OWASP DefectDojo - Open Source Security Sanity
 
Software Testing
Software TestingSoftware Testing
Software Testing
 
Continuous Load Testing with CloudTest and Jenkins
Continuous Load Testing with CloudTest and JenkinsContinuous Load Testing with CloudTest and Jenkins
Continuous Load Testing with CloudTest and Jenkins
 
Break Up the Monolith- Testing Microservices by Marcus Merrell
Break Up the Monolith- Testing Microservices by Marcus MerrellBreak Up the Monolith- Testing Microservices by Marcus Merrell
Break Up the Monolith- Testing Microservices by Marcus Merrell
 
How Vanguard Got to a CD-CD World by Craig Schwarzwald
How Vanguard Got to a CD-CD World by Craig SchwarzwaldHow Vanguard Got to a CD-CD World by Craig Schwarzwald
How Vanguard Got to a CD-CD World by Craig Schwarzwald
 
Continuous Delivery Distilled
Continuous Delivery DistilledContinuous Delivery Distilled
Continuous Delivery Distilled
 
Continuous delivery - tools and techniques
Continuous delivery - tools and techniquesContinuous delivery - tools and techniques
Continuous delivery - tools and techniques
 
Advanced deployment scenarios
Advanced deployment scenariosAdvanced deployment scenarios
Advanced deployment scenarios
 
Webinar: Load Testing for Your Peak Season
Webinar: Load Testing for Your Peak SeasonWebinar: Load Testing for Your Peak Season
Webinar: Load Testing for Your Peak Season
 
Advanced deployment scenarios (netcoreconf)
Advanced deployment scenarios (netcoreconf)Advanced deployment scenarios (netcoreconf)
Advanced deployment scenarios (netcoreconf)
 
Outsmarting Merge Edge Cases in Component Based Design
Outsmarting Merge Edge Cases in Component Based DesignOutsmarting Merge Edge Cases in Component Based Design
Outsmarting Merge Edge Cases in Component Based Design
 
Automating The New York Times Crossword by Phil Wells
Automating The New York Times Crossword by Phil WellsAutomating The New York Times Crossword by Phil Wells
Automating The New York Times Crossword by Phil Wells
 

Similar to Tips from the trenches: Gating Performance

Browserscope oscon 2011
Browserscope oscon 2011Browserscope oscon 2011
Browserscope oscon 2011
lsimon
 
Gatling - Bordeaux JUG
Gatling - Bordeaux JUGGatling - Bordeaux JUG
Gatling - Bordeaux JUG
slandelle
 

Similar to Tips from the trenches: Gating Performance (20)

Java Performance Tuning
Java Performance TuningJava Performance Tuning
Java Performance Tuning
 
improving the performance of Rails web Applications
improving the performance of Rails web Applicationsimproving the performance of Rails web Applications
improving the performance of Rails web Applications
 
OOP 2014 - Lifecycle By Design
OOP 2014 - Lifecycle By DesignOOP 2014 - Lifecycle By Design
OOP 2014 - Lifecycle By Design
 
ATAGTR2017 Unified APM: The new age performance monitoring for production sys...
ATAGTR2017 Unified APM: The new age performance monitoring for production sys...ATAGTR2017 Unified APM: The new age performance monitoring for production sys...
ATAGTR2017 Unified APM: The new age performance monitoring for production sys...
 
TechGIG_Memory leaks in_java_webnair_26th_july_2012
TechGIG_Memory leaks in_java_webnair_26th_july_2012TechGIG_Memory leaks in_java_webnair_26th_july_2012
TechGIG_Memory leaks in_java_webnair_26th_july_2012
 
SSJS, NoSQL, GAE and AppengineJS
SSJS, NoSQL, GAE and AppengineJSSSJS, NoSQL, GAE and AppengineJS
SSJS, NoSQL, GAE and AppengineJS
 
Browserscope oscon 2011
Browserscope oscon 2011Browserscope oscon 2011
Browserscope oscon 2011
 
#NEOTYSPAC performance testing shift left
#NEOTYSPAC performance testing shift left#NEOTYSPAC performance testing shift left
#NEOTYSPAC performance testing shift left
 
Isomorphic React Applications: Performance And Scalability
Isomorphic React Applications: Performance And ScalabilityIsomorphic React Applications: Performance And Scalability
Isomorphic React Applications: Performance And Scalability
 
JavaOne 2015: Top Performance Patterns Deep Dive
JavaOne 2015: Top Performance Patterns Deep DiveJavaOne 2015: Top Performance Patterns Deep Dive
JavaOne 2015: Top Performance Patterns Deep Dive
 
Optimizing performance
Optimizing performanceOptimizing performance
Optimizing performance
 
Qa test managed_code_varhol
Qa test managed_code_varholQa test managed_code_varhol
Qa test managed_code_varhol
 
PAC 2019 virtual Bruno Audoux
PAC 2019 virtual Bruno Audoux PAC 2019 virtual Bruno Audoux
PAC 2019 virtual Bruno Audoux
 
Optimus XPages: An Explosion of Techniques and Best Practices
Optimus XPages: An Explosion of Techniques and Best PracticesOptimus XPages: An Explosion of Techniques and Best Practices
Optimus XPages: An Explosion of Techniques and Best Practices
 
The Autobahn Has No Speed Limit - Your XPages Shouldn't Either!
The Autobahn Has No Speed Limit - Your XPages Shouldn't Either!The Autobahn Has No Speed Limit - Your XPages Shouldn't Either!
The Autobahn Has No Speed Limit - Your XPages Shouldn't Either!
 
Rundeck's History and Future
Rundeck's History and FutureRundeck's History and Future
Rundeck's History and Future
 
Introduction to Tideways
Introduction to TidewaysIntroduction to Tideways
Introduction to Tideways
 
Observability in Java: Getting Started with OpenTelemetry
Observability in Java: Getting Started with OpenTelemetryObservability in Java: Getting Started with OpenTelemetry
Observability in Java: Getting Started with OpenTelemetry
 
Gatling - Bordeaux JUG
Gatling - Bordeaux JUGGatling - Bordeaux JUG
Gatling - Bordeaux JUG
 
What is cool with Domino V10, Proton and Node.JS, and why would I use it in ...
What is cool with Domino V10, Proton and Node.JS, and why would I use it in ...What is cool with Domino V10, Proton and Node.JS, and why would I use it in ...
What is cool with Domino V10, Proton and Node.JS, and why would I use it in ...
 

Recently uploaded

Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
panagenda
 

Recently uploaded (20)

Portal Kombat : extension du réseau de propagande russe
Portal Kombat : extension du réseau de propagande russePortal Kombat : extension du réseau de propagande russe
Portal Kombat : extension du réseau de propagande russe
 
Oauth 2.0 Introduction and Flows with MuleSoft
Oauth 2.0 Introduction and Flows with MuleSoftOauth 2.0 Introduction and Flows with MuleSoft
Oauth 2.0 Introduction and Flows with MuleSoft
 
ASRock Industrial FDO Solutions in Action for Industrial Edge AI _ Kenny at A...
ASRock Industrial FDO Solutions in Action for Industrial Edge AI _ Kenny at A...ASRock Industrial FDO Solutions in Action for Industrial Edge AI _ Kenny at A...
ASRock Industrial FDO Solutions in Action for Industrial Edge AI _ Kenny at A...
 
ECS 2024 Teams Premium - Pretty Secure
ECS 2024   Teams Premium - Pretty SecureECS 2024   Teams Premium - Pretty Secure
ECS 2024 Teams Premium - Pretty Secure
 
What's New in Teams Calling, Meetings and Devices April 2024
What's New in Teams Calling, Meetings and Devices April 2024What's New in Teams Calling, Meetings and Devices April 2024
What's New in Teams Calling, Meetings and Devices April 2024
 
Working together SRE & Platform Engineering
Working together SRE & Platform EngineeringWorking together SRE & Platform Engineering
Working together SRE & Platform Engineering
 
Continuing Bonds Through AI: A Hermeneutic Reflection on Thanabots
Continuing Bonds Through AI: A Hermeneutic Reflection on ThanabotsContinuing Bonds Through AI: A Hermeneutic Reflection on Thanabots
Continuing Bonds Through AI: A Hermeneutic Reflection on Thanabots
 
Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...
Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...
Secure Zero Touch enabled Edge compute with Dell NativeEdge via FDO _ Brad at...
 
1111 ChatGPT Prompts PDF Free Download - Prompts for ChatGPT
1111 ChatGPT Prompts PDF Free Download - Prompts for ChatGPT1111 ChatGPT Prompts PDF Free Download - Prompts for ChatGPT
1111 ChatGPT Prompts PDF Free Download - Prompts for ChatGPT
 
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
 
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
 
PLAI - Acceleration Program for Generative A.I. Startups
PLAI - Acceleration Program for Generative A.I. StartupsPLAI - Acceleration Program for Generative A.I. Startups
PLAI - Acceleration Program for Generative A.I. Startups
 
Easier, Faster, and More Powerful – Notes Document Properties Reimagined
Easier, Faster, and More Powerful – Notes Document Properties ReimaginedEasier, Faster, and More Powerful – Notes Document Properties Reimagined
Easier, Faster, and More Powerful – Notes Document Properties Reimagined
 
Introduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdf
Introduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdfIntroduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdf
Introduction to FDO and How It works Applications _ Richard at FIDO Alliance.pdf
 
BT & Neo4j _ How Knowledge Graphs help BT deliver Digital Transformation.pptx
BT & Neo4j _ How Knowledge Graphs help BT deliver Digital Transformation.pptxBT & Neo4j _ How Knowledge Graphs help BT deliver Digital Transformation.pptx
BT & Neo4j _ How Knowledge Graphs help BT deliver Digital Transformation.pptx
 
The Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdf
The Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdfThe Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdf
The Value of Certifying Products for FDO _ Paul at FIDO Alliance.pdf
 
Linux Foundation Edge _ Overview of FDO Software Components _ Randy at Intel.pdf
Linux Foundation Edge _ Overview of FDO Software Components _ Randy at Intel.pdfLinux Foundation Edge _ Overview of FDO Software Components _ Randy at Intel.pdf
Linux Foundation Edge _ Overview of FDO Software Components _ Randy at Intel.pdf
 
Long journey of Ruby Standard library at RubyKaigi 2024
Long journey of Ruby Standard library at RubyKaigi 2024Long journey of Ruby Standard library at RubyKaigi 2024
Long journey of Ruby Standard library at RubyKaigi 2024
 
WSO2CONMay2024OpenSourceConferenceDebrief.pptx
WSO2CONMay2024OpenSourceConferenceDebrief.pptxWSO2CONMay2024OpenSourceConferenceDebrief.pptx
WSO2CONMay2024OpenSourceConferenceDebrief.pptx
 
Microsoft CSP Briefing Pre-Engagement - Questionnaire
Microsoft CSP Briefing Pre-Engagement - QuestionnaireMicrosoft CSP Briefing Pre-Engagement - Questionnaire
Microsoft CSP Briefing Pre-Engagement - Questionnaire
 

Tips from the trenches: Gating Performance

Editor's Notes

  1. Hi everyone, I am James, I work for a fintech trading company called IG on the trading platforms architecture team; focusing on building performant web applications. I have worked commercially with web technologies for more than 15 years and 7 of those years in my current role at IG. Today I am going to talk about our experiences in ensuring quality in our web applications.
  2. But first who are IG? We are the world’s No.1 spread betting and CFD provider, giving retail investors leveraged access to over 15,000 financial markets We were established 45 years ago in 1974 and currently have 3 developer hubs here in Bangalore(India), Krakow (Poland) and London (UK); working on both collaborative and autonomous projects.
  3. IG supports a wide variety of devices including Android, Android Tablet, iPhone, Ipad and Web. We have up to 1.5 million trades a day Over 11 million executions a month And most orders are filled within 10 milliseconds Today I am going to focus on our web trading platform.
  4. So now you are familiar with IG and what challenges we face. What will we be discussing today? I want to share with you the tips and lessons we have learned from developing our web trading platforms. Firstly I will give an overview of our web platform and what kind of functionality it has. Then I will do a deep dive into the challenges we faced around memory leaks that will cover What memory leaks are Debugging techniques How to measure retained memory Then how to prevent memory leaks getting into production And finally a demo I will then cover how these techniques could be used in other areas
  5. So during my 7 years at IG we began building our newest web trading offering. Which is a single page application that shows real time financial dataand that has users with high performance expectations; who can have the application open for long periods of time. If the application crashes or runs slowly, it could cost our users money. This is why performance is paramount at IG. Our application offers an desktop operating system like experience with users opening “panels” of content.
  6. These panels of content could be used by a client to browse markets for an opportunity to trade while viewing the live prices in our watchlist panel.
  7. Placing a trade by picking a direction; “buy” if they think the market will rise or “sell” if they think the price will fall.
  8. Or managing their current portfolio of trades via the positions panel.
  9. We have had a around 40 developers work on the codebase, who work in an agile environment, releasing the product intraday through a continuous delivery pipeline with post release checks on critical path health. Such as placing a trade and logging in.
  10. Developing this application brought about some challenges and when we released the application to a Beta audience back in 2017; we got some reports from users of the application slowing down over time and even crashing. As many of you may know this can be a warning sign your application has some memory leaks. This was a blow to the developers and after fixing the existing memory leaks we wanted to come up with a way of preventing them in the future.
  11. OK lets have a quick recap of memory works in JavaScript. As many other programming languages JavaScript has the following memory lifecycle… Allocation – where memory allocated by the Operating System. JavaScript is a high level language, so unlike lower level languages this operation isn’t explicit. Usage – Where the program uses the memory to and performs read/write operations, such as assigning a variable. Release – where the allocated memory is no longer needed and release. Again this is not explicit
  12. Memory is collected via the mark and sweep method. Root nodes are identified by the garbage collector, such as Window in the browser environment or Global in Node environment. Then all child nodes are inspected and marked as active or inactive The inactive ones are then cleaned up and that memory is then released. You can see this in the diagram the active nodes are being marked as green and the inactive ones left as blue. The inactive nodes and then collected when the garbage collection takes place.
  13. Memory leaks can occur if retained paths are accidently left pointing to objects. We can see in this simple object graph array has a retaining path to the DOM node. The code below shows the cache array being initialized and the DOM node being pushed into it. Then later the DOM node being removed from the document. However as long as the cache array still has the retaining path it will not be garbage collected. This is often how leaks are caused; it is worth considering that leaks are a human error, so can be nearly always be prevented.
  14. But why do leaks matter though right? It could be your users are on low end devices which maybe hit particularly hard and will not get the best from your application Performance can degrade over time which in turn may end up impacting your heaviest, and possibly most valuable users. This is especially true if you are building a single page application like us and cannot rely on the user navigating away; we have users who potentially can be using the application for hours while monitoring their current portfolio or waiting for the right time to trade. Lastly your reputation with your users; it can degrade trust that you are offering reliable software if it is seen to be crashing or running at a sluggish pace. While our application may not be the most common; a typical routed single page application can still suffer the same kind of issues. If event handlers are not cleaned up at the correct hooks.
  15. So lets talk through the steps for debugging a memory leak. I am going to use a simple example that is a small application that adds 100 items to a list and then allows you to then clear that list.
  16. We would expect an application, such as the one just shown, that creates short lived objects after an action to have a sawtooth type pattern in the performance timeline that represents the objects being created and holding memory and then when removed that memory being freed. If an application has a leak it would be steadily increasing and not dropping back down to the baseline.
  17. To debug a leak you could begin by opening up the task manager in Chrome. The Task Manager is allows you monitor memory is being used by a page in realtime. You would then toggle the memory and Javascript memory columns. The Memory column represents native memory. DOM nodes are stored here. And the Javascript memory column which is the JSHeap.
  18. As you can see when we use the application, by adding and removing the items, the memory usage is increasing, so there maybe a memory leak and it is worth investigating further.
  19. Once you have identified an action you suspect of leaking. You would then typically switch to the performance tab to investigate further. Then enable the Memory checkbox. Force a garbage collection to free up any available memory by clicking the trashcan icon. Then start a recording Repeat the action a number of times, clearing the garbage after each cycle. By repeating the action you can see a potential leak appearing on the timeline. You can see here that the memory usage is going up and being retained after a GC.
  20. Lastly you might head to the memory tab and record a heap snapshot before the action and one after the action for a comparison of the objects created. This allows for much more of a detailed view of the problem once you have established where it lies. You can see here some detached HTML elements that should have been cleared up.
  21. After discussions with the team the performance timeline steps seemed reproduceable and we looked to Codify them. Just like a bug you have reproduced that you would then go on to cover with a test case to ensure it does not resurface. So first we needed the memory usage of the application. This is available via the memory object in the performance API. This is a global object to give access to memory usage information. Which contains… size limit – which is the memory the heap is limited to. total Size - The memory the heap has allocated including free space for the page. used Size - The memory currently being used by the page. This is one we use as we are interested in as we need the currently used memory at points in our applications. All these are returned in bytes
  22. Next we needed to find a way to clear the garbage programmatically. So luckily we found Chrome has a way of doing this. It expose a js flag you can launch Chrome with to enable a global “gc” function that forces a garbage collection when invoked.
  23. Once we had these tools available to us we came up with a recipe to try and get visibility on memory leaks by measuring them… Visit the application in Chrome with the expose GC to enable garbage collection programmatically. Perform a GC to release any available memory Take an initial snapshot, using the memory API Perform an action number of times to exaggerate the problem, for us this might be launching a ”panel Perform another GC to free up any memory Then another snapshot of memory and subtract the initial one This gives us the retained memory, if any.
  24. Here you can see how we went about fitting this into our release process. Our current continuous delivery flow runs on after every commit to master. Once the testing, coverage and linting gates have all passed it will be deployed to production Our application is static, so this only involves deploying an html entry point and associated assets. Once a successful build has taken place we then kick off our performance build step. This launches Chrome via selenium Runs through the performance scenarios, like launching one of our panels a number of times Measures the retained memory And then stores in influxDB It is worth mentioning these scenarios are run on a box inside our infrastructure, but this could be achieved with a cloud service
  25. Those results stored in InfluxDB are then charted using Grafana to monitor usage over time and get visibility of memory leaks in the wild. You can see here that on the Y axis we have retained memory in MB and on the X axis time. We then have a threshold line of 0.25MB. We allow this threshold due to browser libraries or frameworks often holding onto memory due to caches. The memory leak on the chart of 0.6MB was introduced in May last year and present for 4 months before being fixed in September and dropping well below the threshold. The memory leak of 0.6MB that was present for 4 months before being fixed and dropping below the red threshold. The length of time the leak was open shows us how long it can take to fix an issue like this once it is in production and has to be prioritized against other work.
  26. While monitoring memory retention was a big leap from where we were, but was a very reactive way of dealing with the issue and didn’t actually prevent leaks. So we decided try and be more proactive and build them into our existing test process therefore allowing us to gate them.
  27. So here you can see the updated Pipeline. Kicking off a build after a commit to master remains the same However this time the scenarios have been converted into tests that run on headless Chrome. You can see that if the test passes a deployment takes place and the build passes Or if the build failed feedback is given back to the developer and the deployment is prevented This allowed us to completely integrate memory leak regression testing into our CD pipeline.
  28. So what does a performance test look like? We can see it is very much the same as the performance scenarios we ran. We do a garbage collection We take an initial snapshot We run a scenario 10 times, rendering a component, then making sure to destroy it afterwards We then collect the garbage again, take a snapshot and compute the retained memory. But this time instead of reporting; we assert the memory retained is below a threshold As shown in the previous slide we can now use this to gate whether a build passes or fails.
  29. Test framework
  30. So to wrap up we have talked about… Understanding what a memory leak is and how to debug them. Executing a UI action in a controlled way and compare usage before and after. Monitoring over time to get visibility of any memory leaks Writing tests to assert retained memory is below a given threshold which allows you to gate them
  31. For our application we still use our controlled monitoring method, of launching a browser with selenium and running a performance scenario, for some of our other metrics such as… Monitoring the frame rate of intensive actions – live our ticking prices And rendering times of our components Again these run after every successful build of master.
  32. Here we have our price ticking dashboard which shows the frame rate of our ticking prices and the threshold we impose of 30 FPS. We have Frames per second on the Y axis and time on the X axis. Displaying for Chrome and Firefox. Chrome in green and Firefox in yellow here.
  33. And here the positions component rendering time in Milliseconds and how it performs across Chrome, Firefox and Internet Explorer. Chrome in green, Firefox in orange and internet explorer blue. We have milliseconds on the Y axis and datetime on the X axis. These dashboards could both be moved to tests in the same way to prevent regressions in the future; once an acceptable threshold had been agreed with either the business or the developers depending on the area.
  34. So hopefully this helps you understand how at IG we have gained visibility of our performance and prevented performance regressions from being released to production. For us this approach has been very successful and prevented leaks reaching users on a quite a few occasions and given the developers confidence in the code they are deploying.
  35. So thanks for your time and for those interested the code for the demo is available on my Github profile in the link shown.