Jitbit.FastCache
1.0.1
See the version list below for details.
dotnet add package Jitbit.FastCache --version 1.0.1
NuGet\Install-Package Jitbit.FastCache -Version 1.0.1
<PackageReference Include="Jitbit.FastCache" Version="1.0.1" />
paket add Jitbit.FastCache --version 1.0.1
#r "nuget: Jitbit.FastCache, 1.0.1"
// Install Jitbit.FastCache as a Cake Addin
#addin nuget:?package=Jitbit.FastCache&version=1.0.1
// Install Jitbit.FastCache as a Cake Tool
#tool nuget:?package=Jitbit.FastCache&version=1.0.1
FastCache
6x-10x faster alternative to MemoryCache
TL;DR
Bascially it's just a ConcurrentDictionary
with expiration.
Why FastCache is better than System.Runtime.Caching.MemoryCache and Microsoft.Extensions.Caching.MemoryCache.
- 6X faster read times than MemeoryCache.
- 10x faster wites than MemoryCache
- Thread safe and atomic writes
- MemoryCache's come with performnce counters that can't be turned off
Usage
var cache = new FastCache<string, int>();
cache.AddOrUpdate("key", 42, TimeSpan.FromMinutes(1));
cache.TeyGet("key", out int value);
cache.GetOrAdd("key", k => 1024, TimeSpan.FromMilliseconds(100));
Tradeoffs
FastCache uses Environment.TickCount
which is 26x times faster tham DateTime.Now
. But Environment.TickCount
is limited to Int32
. Which means it reset to int.MinValue
once overflowed. In practice this means you cannot cache stuff for more than ~25 days (2.4 billion milliseconds).
Another tradeoff: MemoryCache watches the used memory, and evicts items once it senses memory pressure. FastCache does not do that it is up to you. It's just a dictionary.
Benchmarks
| Method | Mean | Error | StdDev | Gen0 | Allocated |
|--------------------- |----------:|----------:|---------:|-------:|----------:|
| FastCacheLookup | 67.15 ns | 2.582 ns | 0.142 ns | - | - |
| MemoryCacheLookup | 426.60 ns | 60.162 ns | 3.298 ns | 0.0200 | 128 B |
| FastCacheAddRemove | 99.97 ns | 12.040 ns | 0.660 ns | 0.0254 | 160 B |
| MemoryCacheAddRemove | 710.70 ns | 32.415 ns | 1.777 ns | 0.0515 | 328 B |
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.