Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Performance is a Feature!
Why does performance matter?
What do we need to measure?
How we can fix the issues?
Front-end
Database & Caching
.NET CLR
Mechanical
Sympathy
How?
Measure, measure, measure
1. Identify bottlenecks
2. Know the optimisation works
How?
“The simple act of putting a render time in the upper right hand corner of every
page we serve forced us to fix all o...
How?
https://github.com/opserver/Opserver
How?
https://github.com/opserver/Opserver
How?
The Art of Benchmarking
Profiling -> Micro-benchmarks
static void Profile(int iterations, Action action)
{
action(); // warm up
GC.Collect(); // clean up
var watch = new Stopwa...
private static T Result;
static void Profile<T>(int iterations, Func<T> func)
{
func(); // warm up
GC.Collect(); // clean ...
BenchmarkDotNet
BenchmarkDotNet Demo
How?
Garbage Collection (GC)
Allocations are cheap, but cleaning up isn’t
Difficult to measure the impact of GC
http://www...
Stack Overflow Performance Lessons
Stack Overflow Performance Lessons
Use static classes
Don’t be afraid to write your own tools
Dapper, Jil, MiniProfiler,
I...
Roslyn Performance Lessons 1
public class Logger
{
public static void WriteLine(string s) { /*...*/ }
}
public class Boxin...
Roslyn Performance Lessons 1
public class Logger
{
public static void WriteLine(string s) { /*...*/ }
}
public class Boxin...
Roslyn Performance Lessons 2
class Symbol {
public string Name { get; private set; }
/*...*/
}
class Compiler {
private Li...
Roslyn Performance Lessons 2
class Symbol {
public string Name { get; private set; }
/*...*/
}
class Compiler {
private Li...
Roslyn Performance Lessons 3
public class Example
{
// Constructs a name like "Foo<T1, T2, T3>"
public string GenerateFull...
Roslyn Performance Lessons 3
public class Example
{
// Constructs a name like "Foo<T1, T2, T3>"
public string GenerateFull...
Roslyn Performance Lessons 3
[ThreadStatic]
private static StringBuilder cachedStringBuilder;
private static StringBuilder...
Roslyn Performance Lessons Demo
Resources
Questions?
@matthewwarren
www.mattwarren.org
Performance is a feature!  - Developer South Coast - part 2
Performance is a feature!  - Developer South Coast - part 2
Performance is a feature!  - Developer South Coast - part 2
Performance is a feature!  - Developer South Coast - part 2
Upcoming SlideShare
Loading in …5
×

Performance is a feature! - Developer South Coast - part 2

432 views

Published on

Starting with the premise that "Performance is a Feature", this session will look at how to measure, what to measure and how get the best performance from your .NET code.
We will look at real-world examples from the Roslyn code-base and StackOverflow (the product), including how the .NET Garbage Collector needs to be tamed!

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Performance is a feature! - Developer South Coast - part 2

  1. 1. Performance is a Feature!
  2. 2. Why does performance matter? What do we need to measure? How we can fix the issues?
  3. 3. Front-end Database & Caching .NET CLR Mechanical Sympathy
  4. 4. How? Measure, measure, measure 1. Identify bottlenecks 2. Know the optimisation works
  5. 5. How? “The simple act of putting a render time in the upper right hand corner of every page we serve forced us to fix all our performance regressions and omissions.”
  6. 6. How? https://github.com/opserver/Opserver
  7. 7. How? https://github.com/opserver/Opserver
  8. 8. How? The Art of Benchmarking Profiling -> Micro-benchmarks
  9. 9. static void Profile(int iterations, Action action) { action(); // warm up GC.Collect(); // clean up var watch = new Stopwatch(); watch.Start(); for (int i = 0; i < iterations; i++) { action(); } watch.Stop(); Console.WriteLine("Time Elapsed {0} ms", watch.ElapsedMilliseconds); } http://stackoverflow.com/questions/1047218/benchmarking-small- code-samples-in-c-can-this-implementation-be-improved
  10. 10. private static T Result; static void Profile<T>(int iterations, Func<T> func) { func(); // warm up GC.Collect(); // clean up var watch = new Stopwatch(); watch.Start(); for (int i = 0; i < iterations; i++) { Result = func(); } watch.Stop(); Console.WriteLine("Time Elapsed {0} ms", watch.ElapsedMilliseconds); }
  11. 11. BenchmarkDotNet
  12. 12. BenchmarkDotNet Demo
  13. 13. How? Garbage Collection (GC) Allocations are cheap, but cleaning up isn’t Difficult to measure the impact of GC http://www.slideshare.net/benemmett/net-memory-management-ndc-london https://vimeo.com/113632451
  14. 14. Stack Overflow Performance Lessons
  15. 15. Stack Overflow Performance Lessons Use static classes Don’t be afraid to write your own tools Dapper, Jil, MiniProfiler, Intimately know your platform - CLR
  16. 16. Roslyn Performance Lessons 1 public class Logger { public static void WriteLine(string s) { /*...*/ } } public class BoxingExample { public void Log(int id, int size) { var s = string.Format("{0}:{1}", id, size); Logger.WriteLine(s); } } Essential Truths Everyone Should Know about Performance in a Large Managed Codebase
  17. 17. Roslyn Performance Lessons 1 public class Logger { public static void WriteLine(string s) { /*...*/ } } public class BoxingExample { public void Log(int id, int size) { var s = string.Format("{0}:{1}", id.ToString(), size.ToString()); Logger.WriteLine(s); } } AVOID BOXING
  18. 18. Roslyn Performance Lessons 2 class Symbol { public string Name { get; private set; } /*...*/ } class Compiler { private List<Symbol> symbols; public Symbol FindMatchingSymbol(string name) { return symbols.FirstOrDefault(s => s.Name == name); } }
  19. 19. Roslyn Performance Lessons 2 class Symbol { public string Name { get; private set; } /*...*/ } class Compiler { private List<Symbol> symbols; public Symbol FindMatchingSymbol(string name) { foreach (Symbol s in symbols) { if (s.Name == name) return s; } return null; } } DON’T USE LINQ
  20. 20. Roslyn Performance Lessons 3 public class Example { // Constructs a name like "Foo<T1, T2, T3>" public string GenerateFullTypeName(string name, int arity) { StringBuilder sb = new StringBuilder(); sb.Append(name); if (arity != 0) { sb.Append("<"); for (int i = 1; i < arity; i++) { sb.Append('T'); sb.Append(i.ToString()); } sb.Append('T'); sb.Append(arity.ToString()); } return sb.ToString(); } }
  21. 21. Roslyn Performance Lessons 3 public class Example { // Constructs a name like "Foo<T1, T2, T3>" public string GenerateFullTypeName(string name, int arity) { StringBuilder sb = new AcquireBuilder(); sb.Append(name); if (arity != 0) { sb.Append("<"); for (int i = 1; i < arity; i++) { sb.Append('T'); sb.Append(i.ToString()); } sb.Append('T'); sb.Append(arity.ToString()); } return GetStringAndReleaseBuilder(sb); } } OBJECT POOLING
  22. 22. Roslyn Performance Lessons 3 [ThreadStatic] private static StringBuilder cachedStringBuilder; private static StringBuilder AcquireBuilder() { StringBuilder result = cachedStringBuilder; if (result == null) { return new StringBuilder(); } result.Clear(); cachedStringBuilder = null; return result; } private static string GetStringAndReleaseBuilder(StringBuilder sb) { string result = sb.ToString(); cachedStringBuilder = sb; return result; }
  23. 23. Roslyn Performance Lessons Demo
  24. 24. Resources
  25. 25. Questions? @matthewwarren www.mattwarren.org

×