Tuple <int, int> замена

Я использую следующую структуру в веб-службе, где производительность имеет решающее значение. Он используется для создания соединений между объектами данных домена, ключ состоит из двух целых чисел. Идея состоит в том, чтобы соответствовать двум 32-битным целым числам в длинном (64 бита).

Прежде чем использовать эту структуру, я использовал Tuple<int, int>, который был действительно медленнее.

Есть ли дополнительная оптимизация? (например: дополнительное переопределение, ненужное литье и т. д.)

public struct CombinedKey : IEquatable<CombinedKey>
{
   private readonly long value;

   public CombinedKey(int item1, int item2)
   {
        unchecked
        {
            value = (long)item1 << 32 | (uint)item2;
        }
    }

    public override int GetHashCode()
    {
        return (int)value ^ (int)(value >> 32);
    }

    public bool Equals(CombinedKey other)
    {
        return this.value == other.value;
    }

    public int Item1
    {
        get
        {
            return (int)(this.value >> 32);
        }
    }

    public int Item2
    {
        get
        {
            return (int)(this.value & 0xffffffff);
        }
    }
}
11 голосов | спросил tigrou 11 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 11 Sep 2015 14:30:27 +0300 2015, 14:30:27

1 ответ


15

Вы можете использовать явный макет структуры, чтобы опустить вычисления значений.
Он может действовать аналогично union в C /C ++:

[StructLayout(LayoutKind.Explicit)]
public struct CombinedKey : IEquatable<CombinedKey>
{
    [FieldOffset(0)]
    private readonly long value;
    [FieldOffset(0)]
    public readonly int Item1;
    [FieldOffset(sizeof(int))]
    public readonly int Item2;

    public CombinedKey(int item1, int item2)
    {
        value = 0;  // We need to init all the fields
        Item1 = item1;
        Item2 = item2;
    }

    public bool Equals(CombinedKey other)
    {
        return value == other.value;
    }

    public override int GetHashCode()
    {
        return Item1 ^ Item2;
    }
}

Вы также можете переносить поля readonly в свойства get-only.


Дополнительная ссылка: Магия атрибутов StructLayout
ответил Dmitry 11 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 11 Sep 2015 14:39:08 +0300 2015, 14:39:08

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132