Какой из них быстрее: String, BigInteger или Guid для словарного ключа? - PullRequest
0 голосов
/ 27 апреля 2019

Я пытался создать базу данных сущностей, используя словарь с GUID в качестве ключа, я просто хочу знать, какой из них быстрее или занимает меньше памяти по сравнению с другими.

Вотсловари с разными типами ключей:

String

public Dictionary<string, Object> unityObjects;

GUID

public Dictionary<System.Guid, Object> unityObjects;

BigInteger

public Dictionary<BigInteger, Object> unityObjects;

Ключи словаря генерируются с использованием System.Guid:

Guid guid = Guid.NewGuid();

// Using string dictionary
unityObjects.Add(guid.ToString(), myObj);

// Using GUID dictionary
unityObjects.Add(guid, myObj);

// Using BigInteger dictionary
BigInteger bigInt = new BigInteger(guid.ToByteArray());
unityObjects.Add(guid, myObj);

Или я должен использовать меньший уникальный идентификатор с Int32 или Int64 вместо GUID?(Что-то вроде кода ниже)

System.Random rng = new System.Random();

byte[] buf = new byte[8];
rng.NextBytes(buf);
long longRand = BitConverter.ToInt64(buf, 0);

// A GUID with Int64 data type
long guid = (System.Math.Abs(longRand % (long.MaxValue - 0)) + 0);

Ответы [ 2 ]

1 голос
/ 27 апреля 2019

Очевидно, что чем меньше тип данных, тем быстрее он будет. Но для того, чтобы иметь уникальный идентификатор для вашего словаря, использование GUID полезно несколькими способами. Конечно, он немного медленнее, но он гарантированно уникален и создан только для этой цели. Любой, кто видит GUID, знает, почему он есть + плата, которую вы платите с точки зрения производительности, обычно незначительна и не сильно влияет на общую производительность.

Ключевым фактором при выборе между GUID и int, например, является то, нужна ли вам универсальная уникальность для ваших сущностей БД. Если нет, то вы одинаково хороши с примитивными типами.

0 голосов
/ 28 апреля 2019

Направляющие имеют несколько недостатков (неупорядоченные, громоздкие для отладки, большие, некрасивые, приводящие к фрагментации кластеризованных индексов и т. Д.), Поэтому, если вы планируете их использовать, вам действительно нужны ихпреимущества (быстрое создание, легкая репликация / синхронизация / объединение баз данных).Если вы решите пойти с ними, то использование их как есть (без преобразования их в байтовые массивы и т. Д.), Вероятно, будет лучшим вариантом как с точки зрения производительности, так и выявления намерений.

Если вы решите использовать более примитивные типыкак ключи (Int64, Int32), не зависят от rng за их уникальность.Это кажется мне рискованным.Я бы предпочел сделать обход в базу данных, чтобы убедиться, что случайный ключ уникален, или даже лучше получить следующий идентификатор из последовательности, потому что отладка намного проще, когда ключи последовательные.

...