Array.Empty<int>():为什么 Rider 显示分配已发生,而 BenchmarkDotNet 却没有?
Array.Empty<int>(): Why does Rider show an allocation occurred, but BenchmarkDotNet doesn't?
第一张图片中使用的记忆工具来自Rider。据我所知,它显示了对托管堆的分配。第二张图片显示了 BenchmarkDotNet 的结果。
为什么 Rider 显示已进行分配,但 BenchmarkDotNet 却显示未对堆进行分配?
如果我改用下面的代码示例,BenchmarkDotNet 会选择分配:
var i = new int[0];
Array.Empty
指向框架已经静态分配的数组(参见 here)。
当您调用 new int[0]
时,实际上会为您分配一个大小为 0 的新数组。
另请参阅此 answer。
第一张图片中使用的记忆工具来自Rider。据我所知,它显示了对托管堆的分配。第二张图片显示了 BenchmarkDotNet 的结果。
为什么 Rider 显示已进行分配,但 BenchmarkDotNet 却显示未对堆进行分配?
如果我改用下面的代码示例,BenchmarkDotNet 会选择分配:
var i = new int[0];
Array.Empty
指向框架已经静态分配的数组(参见 here)。
当您调用 new int[0]
时,实际上会为您分配一个大小为 0 的新数组。
另请参阅此 answer。