¿Por qué HashSet <Point> es mucho más lento que HashSet <string>?

Quería almacenar algunas ubicaciones de píxeles sin permitir duplicados, así que lo primero que me viene a la mente esHashSet<Point> o clases similares. Sin embargo, esto parece ser muy lento en comparación con algo comoHashSet<string>.

Por ejemplo, este código:

HashSet<Point> points = new HashSet<Point>();
using (Bitmap img = new Bitmap(1000, 1000))
{
    for (int x = 0; x < img.Width; x++)
    {
        for (int y = 0; y < img.Height; y++)
        {
            points.Add(new Point(x, y));
        }
    }
}

Tarda unos 22,5 segundos.

Mientras que el siguiente código(que no es una buena opción por razones obvias) toma solo 1.6 segundos:

HashSet<string> points = new HashSet<string>();
using (Bitmap img = new Bitmap(1000, 1000))
{
    for (int x = 0; x < img.Width; x++)
    {
        for (int y = 0; y < img.Height; y++)
        {
            points.Add(x + "," + y);
        }
    }
}

Entonces, mis preguntas son:

¿Hay alguna razón para eso? lo comprobéesta respuesta, pero 22.5 segundos es mucho más que los números que se muestran en esa respuesta.¿Hay una mejor manera de almacenar puntos sin duplicados?

Respuestas a la pregunta(2)

Su respuesta a la pregunta