Re[36]: почему в C# до сих пор нет наследования конструкторов?
От: Ночной Смотрящий Россия  
Дата: 16.12.22 09:23
Оценка:
Здравствуйте, Codealot, Вы писали:

C>Свитч — еще медленнее, чем vtable.


// * Summary *

BenchmarkDotNet=v0.13.2, OS=Windows 10 (10.0.19045.2251)
Intel Core i7-8565U CPU 1.80GHz (Whiskey Lake), 1 CPU, 8 logical and 4 physical cores
.NET SDK=6.0.401
  [Host]     : .NET 6.0.9 (6.0.922.41905), X64 RyuJIT AVX2
  DefaultJob : .NET 6.0.9 (6.0.922.41905), X64 RyuJIT AVX2


|  Method |     Mean |   Error |  StdDev |
|-------- |---------:|--------:|--------:|
| Virtual | 189.0 us | 3.77 us | 4.03 us |
|  Switch | 178.2 us | 2.98 us | 3.19 us |

  Код теста
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;

BenchmarkRunner.Run<SwitchVsVirtual>();

public class SwitchVsVirtual
{
    private readonly Base[] _vData;
    private readonly SwitchData[] _sData;
    
    public SwitchVsVirtual()
    {
        var rnd = new Random(Environment.TickCount);
        var randoms = Enumerable.Range(0, 10000).Select(_ => rnd.Next(0, 3)).ToArray();
        _vData = randoms
            .Select(r => r switch { 
                0 => (Base)new DerivedA(),
                1 => new DerivedB(),
                2 => new DerivedC(),
                _ => throw new ArgumentOutOfRangeException()
            })
            .ToArray();
        _sData = randoms
            .Select(r => new SwitchData(r switch { 
                0 => Discriminant.A,
                1 => Discriminant.B,
                2 => Discriminant.C,
                _ => throw new ArgumentOutOfRangeException()
            }))
            .ToArray();
    }

    [Benchmark]
    public int Virtual()
    {
        var res = 0;
        foreach (var data in _vData)
            res += data.Data.Length;
        return res;
    }

    [Benchmark]
    public int Switch()
    {
        var res = 0;
        foreach (var d in _sData)
            res += d.Data.Length;
        return res;
    }
}

abstract class Base
{
    public abstract string Data { get; }
}

class DerivedA : Base
{
    public override string Data => "A";
}

class DerivedB : Base
{
    public override string Data => "B";
}

class DerivedC : Base
{
    public override string Data => "C";
}

enum Discriminant { A, B, C }

record SwitchData(Discriminant Discriminant)
{
    public string Data =>
        Discriminant switch
        {
            Discriminant.A => "A",
            Discriminant.B => "B",
            Discriminant.C => "C",
            _ => throw new ArgumentOutOfRangeException()
        };
}


C> Ну так что, ты вообще понимаешь, о чем говоришь?


А ты?
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.