我想更好地了解内存如何在.NET中运行,所以我正在使用BenchmarkDotNet和诊断器.我通过对数组项进行求和来创建基准比较class
和struct
性能.我期望求和值类型总是更快.但对于短阵列则不然.有谁能解释一下?
代码:
internal class ReferenceType
{
public int Value;
}
internal struct ValueType
{
public int Value;
}
internal struct ExtendedValueType
{
public int Value;
private double _otherData; // this field is here just to make the object bigger
}
Run Code Online (Sandbox Code Playgroud)
我有三个数组:
private ReferenceType[] _referenceTypeData;
private ValueType[] _valueTypeData;
private ExtendedValueType[] _extendedValueTypeData;
Run Code Online (Sandbox Code Playgroud)
我使用相同的随机值初始化.
然后是一个基准测试方法:
[Benchmark]
public int ReferenceTypeSum()
{
var sum = 0;
for (var i = 0; i < Size; i++)
{
sum += _referenceTypeData[i].Value; …
Run Code Online (Sandbox Code Playgroud) 如果您有异步方法,如下所示:
private async Task DoAsync()
{
Console.WriteLine(@"(1.1)");
Thread.Sleep(200);
Console.WriteLine(@"(1.2)");
await Task.Delay(1000);
Console.WriteLine(@"(1.3)");
}
Run Code Online (Sandbox Code Playgroud)
并使用Dispatcher异步调用它:
Console.WriteLine(@"(1)");
await Application.Current.Dispatcher.InvokeAsync(DoAsync);
Console.WriteLine(@"(2)");
Run Code Online (Sandbox Code Playgroud)
你得到的输出将是:(1)(1.1)(1.2)(2)(1.3)
如果你使用Dispatcher.BeginInvoke()并且你将等待Completed事件,效果将是相同的(这是预期的):
Console.WriteLine(@"(1)");
var dispatcherOp = Dispatcher.BeginInvoke(new Func<Task>(DoAsync));
dispatcherOp.Completed += (s, args) =>
{
Console.WriteLine(@"(2)");
};
Run Code Online (Sandbox Code Playgroud)
我们在这里看到的是DoAsync()方法中的await使得Dispatcher相信操作已经结束.
我的问题:这是一个错误还是一个功能?你知道任何描述这种行为的文件吗?我找不到任何东西.
我不是要求解决方法.