- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下基准测试,它使用堆栈分配、堆分配和 ArrayPool 分配从文件中读取字符串。
我希望堆栈分配是最快的,因为它只是堆栈指针增量,但根据基准 ArrayPool 稍微快一点。
怎么可能?
static void Main(string[] args)
{
BenchmarkRunner.Run<BenchmarkRead>();
}
using BenchmarkDotNet.Attributes;
using System;
using System.Buffers;
using System.IO;
using System.Linq;
namespace RealTime.Benchmark
{
[MemoryDiagnoser]
public class BenchmarkRead
{
const string TestFile = "TestFiles/animals.txt";
public BenchmarkRead()
{
Directory.CreateDirectory(Path.GetDirectoryName(TestFile));
// cca 100 KB of text
string content = string.Concat(Enumerable.Repeat("dog,cat,spider,cat,bird,", 4000));
File.WriteAllText(TestFile, content);
}
[Benchmark]
public void ReadFileOnPool() => ReadFileOnPool(TestFile);
[Benchmark]
public void ReadFileOnHeap() => ReadFileOnHeap(TestFile);
[Benchmark]
public void ReadFileOnStack() => ReadFileOnStack(TestFile);
public void ReadFileOnHeap(string filename)
{
string text = File.ReadAllText(filename);
// ....call parse
}
public void ReadFileOnStack(string filename)
{
Span<byte> span = stackalloc byte[1024 * 200];
using (var stream = File.OpenRead(filename))
{
int count = stream.Read(span);
if (count == span.Length)
throw new Exception($"Buffer size {span.Length} too small, use array pooling.");
span = span.Slice(0, count);
// ....call parse
}
}
public void ReadFileOnPool(string filename)
{
ArrayPool<byte> pool = ArrayPool<byte>.Shared;
using (var stream = File.OpenRead(filename))
{
long len = stream.Length;
byte[] buffer = pool.Rent((int)len);
try
{
int count = stream.Read(buffer, 0, (int)len);
if (count != len)
throw new Exception($"{count} != {len}");
Span<byte> span = new Span<byte>(buffer).Slice(0, count);
// ....call parse
}
finally
{
pool.Return(buffer);
}
}
}
}
}
| Method | Mean | Gen 0/1k Op | Gen 2/1k Op |Al. memory/Op|
|---------------- |---------:|------------:|------------:|------------:|
| ReadFileOnPool | 109.9 us | 0.1221 | - | 480 B |
| ReadFileOnHeap | 506.0 us | 87.8906 | 58.5938 | 393440 B |
| ReadFileOnStack | 115.2 us | 0.1221 | - | 480 B |
最佳答案
Span<byte> span = stackalloc byte[1024 * 200]
由于 InitLocals 将被零初始化. byte[] buffer = pool.Rent((int)len);
根本不会被零初始化。 Rent()
更昂贵的地步。常规。
关于c# - 为什么 ArrayPool 上的分配比 Stack 上的分配快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55229518/
将 ArrayPool 与引用类型一起使用的正确方法是什么? 我假设它会充满刚刚使用默认构造函数“更新”的对象。 例如,在下面的代码中,当您第一次从 ArrayPool 中租用时,所有的 Foobar
我有以下基准测试,它使用堆栈分配、堆分配和 ArrayPool 分配从文件中读取字符串。 我希望堆栈分配是最快的,因为它只是堆栈指针增量,但根据基准 ArrayPool 稍微快一点。 怎么可能? st
是否可以重新使用在字符串到字节数组转换中使用的内存? 应用程序必须以 60fps 的速度通过网络发送大字符串。这似乎给 GC 带来了太大的压力。那么是否有可能以某种方式重新使用由字符串转换创建的字节数
从 .net RC2 升级到 RTM 后,我发现我需要为派生自 ArrayPool 的 JsonOutputFormatter 的构造函数提供一个参数。我如何获得这个对象?我正在手动更新 JsonOu
我刚刚发现 ArrayPool 的存在,但它的文档有点缺乏。 我想知道 Rent(.)和 Return(.)是线程安全的。 编辑:看起来我没有注意到文档的“线程安全”部分;但阅读了一些评论和答案后,我
MemoryPool 和有什么区别和 ArrayPool据我所知,他们都做同样的事情(出租缓冲区以减少垃圾收集压力)。 在读取调用中是否应该首选使用池 NetworkStream 或 WebSocke
在什么情况下我们应该更喜欢其中一种?看起来像 BufferManager对于汇集大量内存来说不是最佳选择。是真的吗? ArrayPool Class 最佳答案 BufferManager 仅适用于缓冲
我是一名优秀的程序员,十分优秀!