BoysheO.Buffers.PooledBuffer
1.0.0
See the version list below for details.
dotnet add package BoysheO.Buffers.PooledBuffer --version 1.0.0
NuGet\Install-Package BoysheO.Buffers.PooledBuffer -Version 1.0.0
<PackageReference Include="BoysheO.Buffers.PooledBuffer" Version="1.0.0" />
paket add BoysheO.Buffers.PooledBuffer --version 1.0.0
#r "nuget: BoysheO.Buffers.PooledBuffer, 1.0.0"
// Install BoysheO.Buffers.PooledBuffer as a Cake Addin
#addin nuget:?package=BoysheO.Buffers.PooledBuffer&version=1.0.0
// Install BoysheO.Buffers.PooledBuffer as a Cake Tool
#tool nuget:?package=BoysheO.Buffers.PooledBuffer&version=1.0.0
综述 Overview
提供一组API,轻松使用对象池,以减少GC压力。
Provides a set of APIs to easily use object pools to reduce GC pressure.
快速入门 Quick Start
var buff = PooledListBuffer.Rent();
//do something with buff
buff.Disposable();
在高于等于C#8的版本中,可以使用using语句,以减少代码量。
Using statement can be used in C#8 or higher version to reduce code.
using var buff = PooledListBuffer.Rent();
//do something with buff
PooledLinq
PooledLinq提供了一组LINQ扩展方法,以减少GC压力。 PooledLinq遵循如下设计原则:
- 立即求值
- 对原始Buff进行释放操作
- 返回新的Buff
以上3条原则可以简化使用,如诸位要扩展自己的PooledLinq,应该遵循以上原则。
PooledLinq Provides a set of LINQ extension methods to reduce GC pressure. PooledLinq follows the following design principles:
- Immediate evaluation
- Release the original Buff
- Return a new Buff
The above 3 principles simplify the use. If you want to extend your own PooledLinq, you should follow the above principles.
using var buff = new []{1,2,3,4,5,6,7,8,9,10}.ToPooledListBuffer()
.PooledWhere(x=>x%2==0)
.PooledSelect(x=>x*2);
//do something with buff
性能提示 Performance Tips
每次对buff的访问都会有一点额外的安全性检查开销,如果在需要遍历大量数量的情况下,可以调用其Span属性以跳过安全检查来进行遍历。
Accessing buff each time will have a little extra safety check overhead. If you need to traverse a large number of items, you can call its Span property to skip the safety check to traverse.
多线程安全
Rent操作和Disposable操作被设计成线程安全的,但是对buff的访问不是线程安全的,如果需要在多线程中访问buff,需要自行实现线程安全。
Rent operation and Disposable operation are designed to be thread-safe, but access to buff is not thread-safe. If you need to access buff in multiple threads, you need to implement thread safety yourself.
object gate = new object();
using var buff = PooledListBuffer.Rent();
lock(gate)
{
//do something with buff
}
最佳实践 Best Practices
- 仅在需要借用Buff的时候借用,使用完毕后立即归还。并且尽可能不保留对Buff的引用。在安全的前提下尽可能使用Span操作
- 如果一个函数接受一个PooledBuff参数输入,那么在函数内部不要对其进行释放操作,原则上假定调用方需要继续使用该Buff。
- 如果一个函数返回一个PooledBuff结果输出,那么调用方应负责对其进行释放操作。
En:
- Only borrow Buff when needed, return it immediately after use. And try not to keep a reference to Buff. Use Span operation as much as possible under safe conditions.
- If a function accepts a PooledBuff parameter as input, do not release it in the function. In principle, it is assumed that the caller needs to continue to use the Buff.
- If a function returns a PooledBuff result as output, the caller is responsible for releasing it.
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
- Collections.Pooled (>= 1.0.82)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.