private void TestCountByDistinct(IEnumerable <uint> uniqueIdGenerator, int dataSize)
    {
        UnityEngine.Profiling.Profiler.BeginSample("bit counting");
        var data = new NativeArray <uint>(dataSize, Allocator.Persistent);

        var uniqueEntries = new Dictionary <uint, uint>();
        var idGenerator   = uniqueIdGenerator.GetEnumerator();

        for (int i = 0; i < data.Length; i++)
        {
            idGenerator.MoveNext();
            var idHere = idGenerator.Current;
            if (!uniqueEntries.TryGetValue(idHere, out var cnt))
            {
                cnt = 0;
            }
            uniqueEntries[idHere] = cnt + 1;
            data[i] = idHere;
        }

        var counter = new CountByDistinct(data, Allocator.Persistent);

        var idCounts   = counter.GetCounts();
        var dependency = counter.Schedule();

        dependency.Complete();

        data.Dispose();
        UnityEngine.Profiling.Profiler.EndSample();

        using (idCounts)
        {
            foreach (var kvp in uniqueEntries)
            {
                if (!idCounts.TryGetValue(kvp.Key, out var countResult))
                {
                    Assert.Fail($"Missing count for id: {kvp.Key}");
                }
                else
                {
                    Assert.AreEqual(kvp.Value, countResult, $"Expected count for Id '{kvp.Key}' to be {kvp.Value} but was {countResult}");
                }
            }
        }
    }
    public void PerformanceTestCountingBitsNoRuns()
    {
        var data = new NativeArray <uint>(1024 * 1024, Allocator.Persistent);

        var uniqueEntries = new Dictionary <uint, uint>();
        var idGenerator   = RunSequenceGenerator(1, 0, 200).GetEnumerator();

        for (int i = 0; i < data.Length; i++)
        {
            idGenerator.MoveNext();
            var idHere = idGenerator.Current;
            if (!uniqueEntries.TryGetValue(idHere, out var cnt))
            {
                cnt = 0;
            }
            uniqueEntries[idHere] = cnt + 1;
            data[i] = idHere;
        }
        using (data)
        {
            NativeHashMap <uint, uint> idCounts = default;
            Measure.Method(() =>
            {
                var counter = new CountByDistinct(data, Allocator.Persistent);
                idCounts    = counter.GetCounts();
                counter.Schedule().Complete();
            })
            .CleanUp(() =>
            {
                idCounts.Dispose();
            })
            .WarmupCount(10)
            .MeasurementCount(10)
            .IterationsPerMeasurement(3)
            .GC()
            .Run();
        }
    }