Advertisement
GeneralGDA

Is "in" worth it? №0

Dec 15th, 2021 (edited)
534
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.28 KB | None | 0 0
  1. using System;
  2. using System.Collections.Immutable;
  3. using BenchmarkDotNet.Attributes;
  4. using BenchmarkDotNet.Jobs;
  5. using BenchmarkDotNet.Running;
  6.  
  7. namespace Benchmark
  8. {
  9.     [SimpleJob(RuntimeMoniker.Net50)]
  10.     public class ImmutableArrayTest
  11.     {
  12.         [Params(10, 100, 1000)]
  13.         public int ProblemSize;
  14.  
  15.         private ImmutableArray<int> _data;
  16.  
  17.         [GlobalSetup]
  18.         public void Setup()
  19.         {
  20.             var random = new Random();
  21.            
  22.             var builder = ImmutableArray.CreateBuilder<int>(ProblemSize);
  23.             for (int i = 0; i < ProblemSize; ++i)
  24.             {
  25.                 builder.Add(random.Next());
  26.             }
  27.             _data = builder.MoveToImmutable();
  28.         }
  29.  
  30.         static int ViaRef(in ImmutableArray<int> array)
  31.         {
  32.             int sum = 0;
  33.             foreach (var i in array)
  34.             {
  35.                 sum += i;
  36.             }
  37.             return sum;
  38.         }
  39.  
  40.         static int ViaValue(ImmutableArray<int> array)
  41.         {
  42.             int sum = 0;
  43.             foreach (var i in array)
  44.             {
  45.                 sum += i;
  46.             }
  47.             return sum;
  48.         }
  49.  
  50.         [Benchmark]
  51.         public double Ref()
  52.         {
  53.             return ViaRef(_data);
  54.         }
  55.  
  56.         [Benchmark]
  57.         public double Value()
  58.         {
  59.             return ViaValue(_data);
  60.         }
  61.     }
  62.    
  63.     [SimpleJob(RuntimeMoniker.Net50)]
  64.     public class HeavyStruct
  65.     {
  66.     readonly struct Heavy
  67.     {
  68.         public double A { init; get; }
  69.         public double B { init; get; }
  70.         public double C { init; get; }
  71.         public double D { init; get; }
  72.         public double E { init; get; }
  73.     }
  74.      
  75.     private Heavy data;
  76.      
  77.     [GlobalSetup]
  78.     public void Setup()
  79.     {
  80.         var random = new Random();
  81.      
  82.         data = new Heavy
  83.         {
  84.             A = random.NextDouble(),
  85.             B = random.NextDouble(),
  86.             C = random.NextDouble(),
  87.             D = random.NextDouble(),
  88.             E = random.NextDouble(),
  89.         };
  90.     }
  91.      
  92.     static double ViaRef(in Heavy array)
  93.     {
  94.         double sum
  95.             = array.A +
  96.               array.B +
  97.               array.C +
  98.               array.D +
  99.               array.E
  100.               ;
  101.         return sum;
  102.     }
  103.      
  104.     static double ViaValue(Heavy array)
  105.     {
  106.         double  sum
  107.             = array.A +
  108.               array.B +
  109.               array.C +
  110.               array.D +
  111.               array.E
  112.               ;
  113.         return sum;
  114.     }
  115.      
  116.         [Benchmark]
  117.         public double Ref()
  118.         {
  119.             return ViaRef(data);
  120.         }
  121.  
  122.         [Benchmark]
  123.         public double Value()
  124.         {
  125.             return ViaValue(data);
  126.         }
  127.     }
  128.  
  129.     [SimpleJob(RuntimeMoniker.Net50)]
  130.     public class VeryHeavyStruct
  131.     {
  132.         readonly struct Heavy
  133.         {
  134.             public double A { init; get; }
  135.             public double B { init; get; }
  136.             public double C { init; get; }
  137.             public double D { init; get; }
  138.             public double E { init; get; }
  139.  
  140.             public double A1 { init; get; }
  141.             public double B1 { init; get; }
  142.             public double C1 { init; get; }
  143.             public double D1 { init; get; }
  144.             public double E1 { init; get; }
  145.         }
  146.      
  147.         private Heavy data;
  148.      
  149.         [GlobalSetup]
  150.         public void Setup()
  151.         {
  152.             var random = new Random();
  153.      
  154.             data = new Heavy
  155.             {
  156.                 A = random.NextDouble(),
  157.                 B = random.NextDouble(),
  158.                 C = random.NextDouble(),
  159.                 D = random.NextDouble(),
  160.                 E = random.NextDouble(),
  161.  
  162.                 A1 = random.NextDouble(),
  163.                 B1 = random.NextDouble(),
  164.                 C1 = random.NextDouble(),
  165.                 D1 = random.NextDouble(),
  166.                 E1 = random.NextDouble(),
  167.             };
  168.         }
  169.      
  170.         static double ViaRef(in Heavy array)
  171.         {
  172.             double sum
  173.                     = array.A +
  174.                       array.B +
  175.                       array.C +
  176.                       array.D +
  177.                       array.E +
  178.                 array.A1 +
  179.                 array.B1 +
  180.                 array.C1 +
  181.                 array.D1 +
  182.                 array.E1
  183.                 ;
  184.             return sum;
  185.         }
  186.      
  187.         static double ViaValue(Heavy array)
  188.         {
  189.             double sum
  190.                     = array.A +
  191.                       array.B +
  192.                       array.C +
  193.                       array.D +
  194.                       array.E +
  195.                 array.A1 +
  196.                 array.B1 +
  197.                 array.C1 +
  198.                 array.D1 +
  199.                 array.E1
  200.                 ;
  201.             return sum;
  202.         }
  203.      
  204.         [Benchmark]
  205.         public double Ref()
  206.         {
  207.             return ViaRef(data);
  208.         }
  209.  
  210.         [Benchmark]
  211.         public double Value()
  212.         {
  213.             return ViaValue(data);
  214.         }
  215.     }
  216.  
  217.     public static class Program
  218.     {
  219.         public static void Main()
  220.         {
  221.             BenchmarkRunner.Run<VeryHeavyStruct>();
  222.         }
  223.     }
  224. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement