Производительность
November 2, 2022

Как посчитать количество уникальных элементов

Есть два способа вычисления количества уникальных элементов в коллекции: с использование метода Distinct и превращение в множество HashSet. Что более эффективно?

Оказывается, всё зависит от количества уникальных элементов.Оказывается, всё зависит от количества уникальных элементов. Рассмотрим две ситуации.

Ситуация 1. Количество элементов многократно превосходит количество уникальных элементов.

Программа

##
uses Utils;

var n := 1000000;
var a := ArrRandomInteger(n,0,100);

var tmp: integer;
Benchmark(() -> (tmp := a.Distinct.Count)).Println;
Benchmark(() -> (tmp := HSet(a).Count)).Println;

Результат

12.88 мс
14.71 мс

Ситуация 2. Практически все элементы коллекции уникальны

Программа

##
uses Utils;

var n := 1000000;
var a := ArrRandomInteger(n,0,integer.MaxValue-1);

var tmp: integer;
Benchmark(() -> (tmp := a.Distinct.Count)).Println;
Benchmark(() -> (tmp := HSet(a).Count)).Println;

Результат

58.09 мс
39.72 мс

Заключение. Если большинство элементов коллекции уникальны, то предпочтительнее использовать преобразование коллекции во множество HashSet. Если же имеется множество повторяющихся элементов, то предпочтительнее использование метода Distinct.