In my own data I get the following perfomance for a single filter/evaluate on a large dataset
compiled FilteringExpression: circa 50µs
compiled Evaluator: circa 8000µs
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Jobs;
using Gridify;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
namespace BenchmarkBetfairAPI
{
[SimpleJob(RuntimeMoniker.Net60)]
public class Benchmark2
{
[Params(1, 10, 100, 1000)]
public int N;
private const string _jsonRandomData = @"[{""_id"":""61991418b1cb9fdbb7c0d90f"",""index"":0,""guid"":""c7a16806-6089-4e9d-bf41-c3196748fc8a"",""isActive"":true,""balance"":""$2,539.81"",""picture"":""http://placehold.it/32x32"",""age"":28,""eyeColor"":""blue"",""name"":""Rebekah Lancaster"",""gender"":""female"",""company"":""BUZZOPIA"",""email"":""[email protected]"",""phone"":""+1 (943) 410-2534"",""address"":""955 Winthrop Street, Motley, Alaska, 1367"",""about"":""Consectetur laboris deserunt ullamco laborum qui. Elit elit culpa ea reprehenderit eiusmod dolore sit nisi exercitation exercitation qui. Non id enim consectetur aliquip. Esse eu amet eu ipsum esse anim.\r\n"",""registered"":""2014-11-01T03:36:05 -00:00"",""latitude"":-7.594734,""longitude"":-86.450065,""tags"":[""ipsum"",""pariatur"",""ipsum"",""duis"",""velit"",""sunt"",""labore""],""friends"":[{""id"":0,""name"":""Briana Rose""},{""id"":1,""name"":""Nellie Gentry""},{""id"":2,""name"":""Lauren Christensen""}],""greeting"":""Hello, Rebekah Lancaster! You have 7 unread messages."",""favoriteFruit"":""strawberry""},{""_id"":""619914186f4d649ea57dae24"",""index"":1,""guid"":""c10017d0-7bee-4d35-827f-e1acae4cd34e"",""isActive"":true,""balance"":""$2,435.39"",""picture"":""http://placehold.it/32x32"",""age"":26,""eyeColor"":""brown"",""name"":""Marianne Dixon"",""gender"":""female"",""company"":""INCUBUS"",""email"":""[email protected]"",""phone"":""+1 (814) 541-2367"",""address"":""288 Bills Place, Chilton, Puerto Rico, 8522"",""about"":""Aute et tempor incididunt ex ea est nisi labore. Ea nulla irure exercitation eu excepteur velit. Nisi dolore amet dolor occaecat duis ullamco ea exercitation consectetur esse et dolor. Nulla non tempor proident deserunt cillum culpa nisi adipisicing. Enim labore ut deserunt commodo excepteur.\r\n"",""registered"":""2017-03-25T08:32:50 -00:00"",""latitude"":-74.531797,""longitude"":123.413538,""tags"":[""ea"",""laborum"",""esse"",""et"",""non"",""incididunt"",""nostrud""],""friends"":[{""id"":0,""name"":""Mayo Mays""},{""id"":1,""name"":""Alba Frazier""},{""id"":2,""name"":""Lilly Dodson""}],""greeting"":""Hello, Marianne Dixon! You have 2 unread messages."",""favoriteFruit"":""banana""},{""_id"":""619914185c7d311604f76e51"",""index"":2,""guid"":""382e4d71-1bd5-4c2b-84a9-be05ad64aef9"",""isActive"":false,""balance"":""$1,500.22"",""picture"":""http://placehold.it/32x32"",""age"":24,""eyeColor"":""green"",""name"":""Terry Pratt"",""gender"":""female"",""company"":""COMDOM"",""email"":""[email protected]"",""phone"":""+1 (841) 417-3492"",""address"":""330 Ashland Place, Matthews, New Jersey, 6345"",""about"":""Eiusmod pariatur deserunt anim velit nulla culpa est velit consectetur mollit tempor incididunt. Est pariatur adipisicing ea consequat duis esse sit ad reprehenderit labore deserunt aliqua. Et sit culpa anim nulla enim nostrud et anim ad mollit. Non sunt dolore ullamco amet duis cillum. Est irure nisi commodo eiusmod mollit. Mollit Lorem eiusmod ullamco ipsum in nostrud est aute.\r\n"",""registered"":""2014-02-15T07:09:38 -00:00"",""latitude"":39.257497,""longitude"":-107.209067,""tags"":[""ex"",""eu"",""eu"",""eiusmod"",""do"",""ullamco"",""proident""],""friends"":[{""id"":0,""name"":""Rose Singleton""},{""id"":1,""name"":""Hubbard Richmond""},{""id"":2,""name"":""Shaffer Fields""}],""greeting"":""Hello, Terry Pratt! You have 6 unread messages."",""favoriteFruit"":""apple""},{""_id"":""619914187d84fac75ac71aee"",""index"":3,""guid"":""f22d0da4-8127-441a-8835-5e521e6897bb"",""isActive"":true,""balance"":""$2,245.92"",""picture"":""http://placehold.it/32x32"",""age"":26,""eyeColor"":""blue"",""name"":""Angelique Ortega"",""gender"":""female"",""company"":""ZAGGLE"",""email"":""[email protected]"",""phone"":""+1 (915) 446-2976"",""address"":""755 Campus Road, Rosedale, District Of Columbia, 407"",""about"":""Qui dolore ad culpa irure aliqua excepteur minim nisi adipisicing. Exercitation irure non nulla nulla aute. Do dolore voluptate culpa labore dolore consectetur id sint non incididunt pariatur id sit.\r\n"",""registered"":""2021-10-19T09:39:14 -01:00"",""latitude"":-89.710554,""longitude"":-64.470535,""tags"":[""labore"",""excepteur"",""ex"",""cupidatat"",""et"",""ut"",""aliqua""],""friends"":[{""id"":0,""name"":""Mildred Case""},{""id"":1,""name"":""Pansy Morton""},{""id"":2,""name"":""Amber Brown""}],""greeting"":""Hello, Angelique Ortega! You have 9 unread messages."",""favoriteFruit"":""apple""},{""_id"":""619914183a9ba122628e8504"",""index"":4,""guid"":""52654a62-5ee9-409a-978c-b38b482bf69a"",""isActive"":false,""balance"":""$2,468.77"",""picture"":""http://placehold.it/32x32"",""age"":20,""eyeColor"":""blue"",""name"":""Jacqueline England"",""gender"":""female"",""company"":""INVENTURE"",""email"":""[email protected]"",""phone"":""+1 (801) 553-2309"",""address"":""545 Halleck Street, Saddlebrooke, Washington, 8073"",""about"":""Sint aute commodo est ad esse qui excepteur velit nostrud. Nostrud nostrud sunt sit excepteur id velit culpa. Officia ea velit proident eu. Minim sit proident laboris nostrud excepteur sint tempor mollit in quis.\r\n"",""registered"":""2021-10-16T12:46:13 -01:00"",""latitude"":-29.528122,""longitude"":105.622315,""tags"":[""duis"",""minim"",""laboris"",""nisi"",""proident"",""dolor"",""ea""],""friends"":[{""id"":0,""name"":""Obrien Cain""},{""id"":1,""name"":""Milagros Downs""},{""id"":2,""name"":""Torres Barlow""}],""greeting"":""Hello, Jacqueline England! You have 1 unread messages."",""favoriteFruit"":""banana""}]";
private Root[] _deserializedClass;
Func<Root, bool>? _compiledFilterExpression;
Func<IEnumerable<Root>, bool> _compiledEvaluator;
[GlobalSetup]
public void Setup()
{
_deserializedClass = JsonConvert.DeserializeObject<Root[]>(_jsonRandomData);
// Setup compiled filter
var gridifyMapper = new GridifyMapper<Root>().GenerateMappings()
.AddMap("Gender", q => q.Gender);
var filterQuery = new GridifyQuery() { Filter = "Gender=female" };
_compiledFilterExpression = filterQuery.GetFilteringExpression(gridifyMapper).Compile();
// Setup compiled evaluate
var builder = new QueryBuilder<Root>()
.AddCondition("Gender=female");
_compiledEvaluator = builder.BuildCompiledEvaluator();
#if DEBUG
N = 1;
Filter();
Evaluate();
#endif
}
[Benchmark(Baseline = true)]
public void Filter()
{
for (int n = 0; n < N; n++)
{
var filter1 = _deserializedClass.Where(_compiledFilterExpression);
var match = filter1.Any();
}
}
[Benchmark]
public void Evaluate()
{
for (int n = 0; n < N; n++)
{
var evaluate = _compiledEvaluator(_deserializedClass);
}
}
}
public class Friend
{
public int Id { get; set; }
public string Name { get; set; }
}
public class Root
{
public string Id { get; set; }
public int Index { get; set; }
public string Guid { get; set; }
public bool IsActive { get; set; }
public string Balance { get; set; }
public string Picture { get; set; }
public int Age { get; set; }
public string EyeColor { get; set; }
public string Name { get; set; }
public string Gender { get; set; }
public string Company { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public string Address { get; set; }
public string About { get; set; }
public string Registered { get; set; }
public double Latitude { get; set; }
public double Longitude { get; set; }
public List<string> Tags { get; set; }
public List<Friend> Friends { get; set; }
public string Greeting { get; set; }
public string FavoriteFruit { get; set; }
}
}