Skip to main content

BenchmarkDotNet usage examples. Compare String Equals methods, and For vs ForEach.

// ------------------------------------------------------------------------
// String Equals Benchmarks
//
// Source: https://github.com/cmendible/dotnetcore.samples/blob/master/benchmarkdotnet/Program.cs
// Related: https://jonlabelle.com/snippets/view/markdown/powerful-easy-net-library-for-benchmarking
// ------------------------------------------------------------------------

using System;
using System.Linq;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;

namespace benchmark
{
    public class Program
    {
        public static void Main(string[] args)
        {
            // Use BenchmarkRunner.Run to Benchmark your code...
            var summary = BenchmarkRunner.Run<StringCompareVsEquals>();
        }
    }

    // We're using .NET Core, so add the CoreJobAttribute here
    [SimpleJob(baseline: true)]
    [RPlotExporter, RankColumn]
    public class StringCompareVsEquals
    {
        private static Random random = new Random();
        private string s1;
        private string s2;

        public static string RandomString(int length)
        {
            const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            return new string(Enumerable.Repeat(chars, length)
                .Select(s => s[random.Next(s.Length)]).ToArray());
        }

        // Run the test for 3 diff string lengths... 10, 100 and 10000
        [Params(10, 100, 10000)]
        public int N;


        // Create two random strings for each set of params
        [GlobalSetup]
        public void Setup()
        {
            s1 = RandomString(N);
            s2 = RandomString(N);
        }

        // This is the slow way of comparing strings, so let's benchmark it.
        [Benchmark]
        public bool Slow() => s1.ToLower() == s2.ToLower();

        // This is the fast way of comparing strings, so let's benchmark it.
        [Benchmark]
        public bool Fast() => string.Compare(s1, s2, true) == 0;

        // This is the fastest!!! way of comparing strings, so let's benchmark it.
        [Benchmark]
        public bool Faster() => string.Equals(s1, s2, StringComparison.OrdinalIgnoreCase);
    }
}

// ------------------------------------------------------------------------
// For vs ForEach Benchmarks
//
// Source: https://github.com/cmendible/dotnetcore.samples/blob/master/benchmarkdotnet.for/Program.cs
// Related: https://jonlabelle.com/snippets/view/markdown/powerful-easy-net-library-for-benchmarking
// ------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;

namespace benchmark
{
    public class Program
    {
        public static void Main(string[] args)
        {
            // Use BenchmarkRunner.Run to Benchmark your code
            var summary = BenchmarkRunner.Run<ForEachVsFor>();
        }
    }

    // We are using .Net Core we are adding the CoreJobAttribute here.
    [SimpleJob(baseline: true)]
    [RPlotExporter, RankColumn]
    public class ForEachVsFor
    {
        private static Random random = new Random();
        private List<int> list;

        public static List<int> RandomIntList(int length)
        {
            int Min = 1;
            int Max = 10;
            return Enumerable
                .Repeat(0, length)
                .Select(i => random.Next(Min, Max))
                .ToList();
        }

        // We wil run the test for 3 diff list sizes
        [Params(10, 100, 1000)]
        public int N;

        [GlobalSetup]
        public void Setup()
        {
            list = RandomIntList(N);
        }

        // Foreach is ~2 times slower than for
        [Benchmark]
        public void Foreach()
        {
            int total = 0;
            foreach (int i in list)
            {
                total += i;
            }
        }

        // For is ~2 times faster than foreach
        [Benchmark]
        public void For()
        {
            int total = 0;
            for (int i = 0; i < list.Count; i++)
            {
                total += list[i];
            }
        }
    }
}

// ------------------------------------------------------------------------
// dotnet/efcore
// ------------------------------------------------------------------------

// See https://github.com/dotnet/efcore/tree/master/benchmark