File: TextDifferencing\SourceTextDifferBenchmark.cs
Web Access
Project: src\src\Razor\src\Razor\benchmarks\Microsoft.AspNetCore.Razor.Microbenchmarks\Microsoft.AspNetCore.Razor.Microbenchmarks.csproj (Microsoft.AspNetCore.Razor.Microbenchmarks)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Linq;
using BenchmarkDotNet.Attributes;
using Microsoft.AspNetCore.Razor.PooledObjects;
using Microsoft.CodeAnalysis.Razor.TextDifferencing;
using Microsoft.CodeAnalysis.Text;
 
namespace Microsoft.AspNetCore.Razor.Microbenchmarks.TextDifferencing;
 
public class SourceTextDifferBenchmark
{
    private SourceText? _largeFileOriginal;
    private SourceText? _largeFileMinimalChanges;
    private SourceText? _largeFileSignificantChanges;
 
    [GlobalSetup]
    public void GlobalSetup()
    {
        var largeFileText = Resources.GetResourceText("MSN.cshtml");
 
        _largeFileOriginal = SourceText.From(largeFileText);
 
        var changedText = largeFileText.Insert(100, "<");
        _largeFileMinimalChanges = SourceText.From(changedText);
 
        // Reverse the last half of the file
        using var _ = StringBuilderPool.GetPooledObject(out var builder);
 
        foreach (var ch in largeFileText[(largeFileText.Length / 2)..].Reverse())
        {
            builder.Append(ch);
        }
 
        changedText = builder.ToString();
        _largeFileSignificantChanges = SourceText.From(changedText);
    }
 
    [Benchmark(Description = "Line Diff - One line change (Typing)")]
    public void LineDiff_LargeFile_OneLineChanged()
    {
        SourceTextDiffer.GetMinimalTextChanges(_largeFileOriginal!, _largeFileMinimalChanges!, DiffKind.Line);
    }
 
    [Benchmark(Description = "Line Diff - Significant Changes (Copy-paste)")]
    public void LineDiff_LargeFile_SignificantlyDifferent()
    {
        SourceTextDiffer.GetMinimalTextChanges(_largeFileOriginal!, _largeFileSignificantChanges!, DiffKind.Line);
    }
 
    [Benchmark(Description = "Character Diff - One character change (Typing)")]
    public void CharDiff_LargeFile_OneCharChanged()
    {
        SourceTextDiffer.GetMinimalTextChanges(_largeFileOriginal!, _largeFileMinimalChanges!, DiffKind.Char);
    }
}