为什么动态投放的速度快于对象投放的速度

问题描述 投票:2回答:1

所以我真的很困惑,请使用以下代码:

[Benchmark]
public TEnum DynamicCast()
{
    return (TEnum)(dynamic)0;
}

[Benchmark]
public TEnum ObjectCast()
{
    return (TEnum)(object)0;
}

[Benchmark]
public TEnum DirectCast()
{
    return (TEnum)0;
}

public enum TEnum
{
    Foo,
    Bar
}

是的,我知道我可以将整数直接转换为给定的Enum,但这是我的实际代码的简化版本,其中包括使用通用扩展的工作。

无论如何,我进行了一些性能测试,因为我很好奇哪个测试速度更快。我正在使用BenchmarkDotNet并在那里查看:

BenchmarkDotNet=v0.12.0, OS=Windows 10.0.18362
Intel Core i7-6700HQ CPU 2.60GHz (Skylake), 1 CPU, 8 logical and 4 physical cores
.NET Core SDK=3.1.100
  [Host]     : .NET Core 3.1.0 (CoreCLR 4.700.19.56402, CoreFX 4.700.19.56404), X64 RyuJIT
  DefaultJob : .NET Core 3.1.0 (CoreCLR 4.700.19.56402, CoreFX 4.700.19.56404), X64 RyuJIT


|      Method |       Mean |     Error |    StdDev |     Median |  Gen 0 | Gen 1 | Gen 2 | Allocated |
|------------ |-----------:|----------:|----------:|-----------:|-------:|------:|------:|----------:|
| DynamicCast |  8.2124 ns | 0.0803 ns | 0.0671 ns |  8.2134 ns | 0.0076 |     - |     - |      24 B |
|  ObjectCast | 13.9178 ns | 0.4822 ns | 0.5922 ns | 13.6714 ns | 0.0076 |     - |     - |      24 B |
|  DirectCast |  0.0538 ns | 0.0422 ns | 0.0534 ns |  0.0311 ns |      - |     - |     - |         - |

动态版本实际上更快,而不仅仅是一点点。我进行了多次测试,无法忍受。如果可能有任何优化,我查看了编译版本,但请参见here

有人可以向我解释吗?

c# performance object dynamic performance-testing
1个回答
0
投票

我相信隐式/显式类型转换会影响您的操作。DirectCast是显式转换中最快的-ObjectCastDynamicCast正在实现通常会在您的结果中使用的隐式转换。

© www.soinside.com 2019 - 2024. All rights reserved.