Let's say you have implemented a small data pipeline library to replace LINQ.
module TrivialStream =
type Receiver<'T> = 'T -> unit
type Stream<'T> = Receiver<'T> -> unit
module Details =| /* | |
| The absence of the C# unsafe keyword and switch does not guarantee code | |
| is type or memory safe. It merely prevents the use of pointer types and | |
| fixed size buffers. | |
| The only thing that can guarantee type and memory safety is | |
| verification and CAS/transparency enforcement. | |
| In particular, the absence of unsafe C# blocks does NOT: |
| using BenchmarkDotNet.Attributes; | |
| using BenchmarkDotNet.Attributes.Columns; | |
| using BenchmarkDotNet.Configs; | |
| using BenchmarkDotNet.Running; | |
| using System; | |
| using System.Collections; | |
| using System.Collections.Generic; | |
| using System.Linq; | |
| using System.Runtime.CompilerServices; |
| /** | |
| veh_hook Vectored Exception Handler hooking library | |
| Version: 24-March-2008 | |
| **/ | |
| #define WINVER 0x0501 | |
| #define _WIN32_WINNT 0x0501 | |
| #include <windows.h> | |
| #include "veh_hook.h" | |
| static veh_list_t* list = NULL; |
| /* | |
| Q: At which size is it preferrable to use binary search over a simple linear search for a small ordered set? | |
| R: Under 5 elements, linear search is slightly faster (from 200% to 10% faster) | |
| But in practice, not sure a switch case to select the best method is really worth it | |
| Unless main usecase is having most of the time only 1-2 elements (so it could be optimized manually without a loop and switch to binary otherwise) | |
| At 3-4 elements, linear is only 10-5% faster | |
| Relative performance between linear and binary search: | |
| size x86 x64 |
| [Config(typeof(Config))] | |
| public class ContinueWithAllocations | |
| { | |
| private class Config : ManualConfig | |
| { | |
| public Config() | |
| { | |
| Add(new MemoryDiagnoser()); | |
| } | |
| } |
| using Microsoft.Diagnostics.Runtime; | |
| using System; | |
| using System.Collections.Generic; | |
| using System.Diagnostics; | |
| using System.Linq; | |
| using System.Text; | |
| using System.Threading.Tasks; | |
| namespace SDDTriage | |
| { |
| public interface IObjectPool<T> | |
| { | |
| T Rent(); | |
| void Return(T obj); | |
| } | |
| public interface IResetable | |
| { | |
| void Reset(); | |
| } |
| using System; | |
| using System.Collections.Generic; | |
| using System.Diagnostics; | |
| using System.Linq; | |
| using System.Text; | |
| using System.Threading.Tasks; | |
| namespace StackAllocVsHeapAlloc | |
| { | |
| public static class Sandbox |
| using System; | |
| using System.Reflection; | |
| using System.Reflection.Emit; | |
| namespace ConsoleApplication3.Test | |
| { | |
| static class EntityPtr | |
| { | |
| private static readonly IEntityPtr converter = CreateConverter(); |