RSSAmplifier

Blog

Adam Sitnik

.NET Performance and Reliability

adamsitnik.comRSS feed ↗10 posts

Latest posts

Profiling .NET on Linux with BenchmarkDotNet

PerfCollectProfiler PerfCollectProfiler is a new BenchmarkDotNet diagnoser (plugin) that was released as part of 0.13.3. It can profile the benchmarked .NET code on Linux and export the data to a trace file which can be opened with PerfView, speedscope or any other tool that supports perf file format.

Profiling .NET Code with PerfView and visualizing it with speedscope.app

speedscope.app According to the official web page, speedscope.app is “a fast, interactive web-based viewer for performance profiles”. But I believe it’s more than that! In my opinion, it’s one of the best visualization tools for performance profiles ever! Some time ago I have implemented SpeedScopeExporter which allows exporting any .NET Trace file to a speedscope json file format. It was released…

Profiling Concurrent .NET Code with BenchmarkDotNet and visualizing it with Concurrency Visualizer

Concurrency Visualizer Profiler ConcurrencyVisualizerProfiler is the new diagnoser for BenchmarkDotNet that I have implemented some time ago. It was released as part of 0.11.3. It allows to profile the benchmarked .NET code on Windows and exports the data to a trace file which can be opened with Concurrency Visualizer (plugin for Visual Studio, used to be a part of it). Again with a single config!

Sample performance investigation using BenchmarkDotNet and PerfView

Introduction Part of my job on the .NET Team is to improve the performance of existing .NET libraries. My current goal is to identify performance bottlenecks in ML.NET and recognize common performance issues that should be addressed by .NET framework. In this blog post, I am describing how I approach sample performance problem using available free .NET tools and best practices for performance…

Profiling .NET Code with BenchmarkDotNet

ETW Profiler EtwProfiler is the new diagnoser for BenchmarkDotNet that I have just finished. It was released as part of 0.11.2. It allows to profile the benchmarked .NET code on Windows and exports the data to a trace file which can be opened with PerfView or Windows Performance Analyzer. Again with a single config!

My way of Conducting an Interview

Interviewing people is not an easy job to do. You want to find the person which is going to get things done, enjoy working with given project, fit into the team and be happy about the money you can offer. As an interviewer, you are also being judged by the candidate. You very often create the first impression of the company. So you also need to make a good impression. Nobody wants to work with…

Disassembling .NET Code with BenchmarkDotNet

Disassembly Diagnoser Disassembly Diagnoser is the new diagnoser for BenchmarkDotNet that I have just finished. It was released as part of 0.10.10. It allows to disassemble the benchmarked .NET code: to ASM: desktop .NET: LegacyJit (32 & 64 bit), RyuJIT (64 bit) .NET Core 1.1+ (including .NET Core 2.0) for RyuJIT (64 bit) Mono: 32 & 64 bit, including LLVM to IL and corresponding C# code: desktop…

Span

tl;dr Use Span to work with ANY kind of memory in a safe and very efficient way. Simplify your APIs and use the full power of unmanaged memory! Contents Introduction Introduction C# gives us great flexibility when it comes to using different kinds of memory. But the majority of the developers use only the managed one. Let’s take a brief look at what C# has to offer for us: Stack memory - allocated…

ref returns and ref locals

tl;dr Pass and return by reference to avoid large struct copying. It’s type and memory safe. It can be even faster than unsafe! Introduction Since C# 1.0 we could pass arguments to methods by reference. It means that instead of copying value types every time we pass them to a method we can just pass them by reference. It allows us to overcome one of the very few disadvantages of value types which…

Value Types vs Reference Types

tl;dr structs have better data locality. Value types add much less pressure for the GC than reference types. But big value types are expensive to copy and you can accidentally box them which is bad. Introduction The .NET framework implements Reference Types and Value Types. C# allows us to define custom value types by using struct and enum keywords. class, delegate and interface are for reference…