Skip to content

Instantly share code, notes, and snippets.

@jaredpar
Created July 20, 2021 17:54
Show Gist options
  • Select an option

  • Save jaredpar/019d3ed170c144b6f8a129eba7368969 to your computer and use it in GitHub Desktop.

Select an option

Save jaredpar/019d3ed170c144b6f8a129eba7368969 to your computer and use it in GitHub Desktop.
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using System;
using System.Runtime.CompilerServices;
using System.Text;
namespace benchmark
{
class Program
{
static void Main(string[] args)
{
var summary = BenchmarkRunner.Run(typeof(Program).Assembly);
}
}
public class ToStringFix
{
[Benchmark]
public new void ToString()
{
R1 r1 = new R1()
{
Name = "blah"
};
r1.R2 = new R2();
r1.R2.R1 = r1;
r1.ToString();
}
[Benchmark]
public void ToStringWithEnsure()
{
R1E r1 = new R1E()
{
Name = "blah"
};
r1.R2 = new R2E();
r1.R2.R1 = r1;
r1.ToString();
}
}
public class R1
{
public int Limit;
public string Name { get; set; }
public R2 R2 { get; set; }
public override string ToString()
{
if (Limit++ == 500)
{
return "";
}
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("R1");
stringBuilder.Append(" { ");
if (PrintMembers(stringBuilder))
{
stringBuilder.Append(" ");
}
stringBuilder.Append("}");
return stringBuilder.ToString();
}
protected virtual bool PrintMembers(StringBuilder builder)
{
builder.Append("name");
builder.Append(" = ");
builder.Append((object)Name);
builder.Append(", ");
builder.Append("R2");
builder.Append(" = ");
builder.Append(R2);
return true;
}
}
public class R2
{
public R1 R1 { get; set; }
public override string ToString()
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("R2");
stringBuilder.Append(" { ");
if (PrintMembers(stringBuilder))
{
stringBuilder.Append(" ");
}
stringBuilder.Append("}");
return stringBuilder.ToString();
}
protected virtual bool PrintMembers(StringBuilder builder)
{
builder.Append("r1");
builder.Append(" = ");
builder.Append(R1);
return true;
}
}
public class R1E
{
public int Limit;
public string Name { get; set; }
public R2E R2 { get; set; }
public override string ToString()
{
if (Limit++ == 500)
{
return "";
}
try
{
RuntimeHelpers.EnsureSufficientExecutionStack();
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("R1");
stringBuilder.Append(" { ");
if (PrintMembers(stringBuilder))
{
stringBuilder.Append(" ");
}
stringBuilder.Append("}");
return stringBuilder.ToString();
}
catch
{
return "";
}
}
protected virtual bool PrintMembers(StringBuilder builder)
{
builder.Append("name");
builder.Append(" = ");
builder.Append((object)Name);
builder.Append(", ");
builder.Append("R2");
builder.Append(" = ");
builder.Append(R2);
return true;
}
}
public class R2E
{
public R1E R1 { get; set; }
public override string ToString()
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("R2");
stringBuilder.Append(" { ");
if (PrintMembers(stringBuilder))
{
stringBuilder.Append(" ");
}
stringBuilder.Append("}");
return stringBuilder.ToString();
}
protected virtual bool PrintMembers(StringBuilder builder)
{
builder.Append("r1");
builder.Append(" = ");
builder.Append(R1);
return true;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment