Skip to content

Instantly share code, notes, and snippets.

@atifaziz
Last active April 4, 2017 12:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save atifaziz/0b4bbcb43e7e726d1a4eec1f9157df2f to your computer and use it in GitHub Desktop.
Save atifaziz/0b4bbcb43e7e726d1a4eec1f9157df2f to your computer and use it in GitHub Desktop.
Benchmarking performance of reference versus value tuples

BenchmarkDotNet=v0.10.3.0, OS=Microsoft Windows NT 6.2.9200.0
Processor=Intel(R) Core(TM) i7-6600U CPU 2.60GHz, ProcessorCount=4
Frequency=2742188 Hz, Resolution=364.6723 ns, Timer=TSC
  [Host]     : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1086.0
  DefaultJob : Clr 4.0.30319.42000, 64bit RyuJIT-v4.6.1086.0


Method Mean StdDev Median
TupleTest 3.9393 ms 0.1072 ms 3.8956 ms
ValueTupleTest 21.6276 ms 1.4960 ms 20.8771 ms
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Runtime.CompilerServices;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
public class TupleVsValueTupleBenchmarks
{
static IEnumerable<Tuple<int, string, string, string, string, IPAddress>> _tupleData;
static IEnumerable<(int Id, string FirstName, string LastName, string Email, string Gender, IPAddress IpAddress)> _valueTupleData;
[Benchmark]
public void TupleTest()
{
foreach (var x in _tupleData)
Do(x, 0);
}
[Benchmark]
public void ValueTupleTest()
{
foreach (var x in _valueTupleData)
Do(x, 0);
}
[MethodImpl(MethodImplOptions.NoInlining)]
public Tuple<int, string, string, string, string, IPAddress> Do(Tuple<int, string, string, string, string, IPAddress> e, int level) =>
level < 16 ? Do(e, level + 1) : e;
[MethodImpl(MethodImplOptions.NoInlining)]
public (int, string, string, string, string, IPAddress) Do((int, string, string, string, string, IPAddress) e, int level) =>
level < 16 ? Do(e, level + 1) : e;
[Setup]
public void Init()
{
using (var http = new HttpClient())
{
var csv = http.GetStringAsync("https://gist.githubusercontent.com/atifaziz/15ecebe1a99b3b1d66f262762ac757dd/raw/988e111dd600a995d1be106768363b9ca131342d/mockaroo.csv").Result;
var data =
from lines in Enumerable.Repeat(csv.Split('\n').Skip(1), 100)
from line in lines
select line.Trim().Split(',') into row
where row.Length == 6
select new object[]
{
int.Parse(row[0]),
row[1],
row[2],
row[3],
row[4],
IPAddress.Parse(row[5]),
};
_tupleData =
from row in data
select Tuple.Create((int) row[0],
(string) row[1],
(string) row[2],
(string) row[3],
(string) row[4],
(IPAddress) row[5]);
_tupleData = _tupleData.ToArray();
_valueTupleData =
from row in data
select ((int) row[0],
(string) row[1],
(string) row[2],
(string) row[3],
(string) row[4],
(IPAddress) row[5]);
_valueTupleData = _valueTupleData.ToArray();
}
}
}
static class Program
{
static void Main(string[] args) =>
BenchmarkRunner.Run<TupleVsValueTupleBenchmarks>();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment