System.Collections.Generic.Dictionary = Ultimate performance?

Я пишу целевой Haxe C #, и я изучал различия в производительности для Haxe ' s std, чтобы мы могли обеспечить максимальную производительность за счет кроссплатформенного кода.

Один очень хороший пример - код хэш-таблицы. Я немного неохотно использовал словарь .NET, поскольку он кажется громоздким (структуры для пар ключ / значение могут занимать огромный объем памяти из-за проблем с выравниванием памяти, помимо ненужной информации, хранящейся в них), и поскольку на std В библиотеке нет такой вещи, как хэш объекта, я действительно думал, что смогу немного снизить производительность, не вызывая GetHashCode и все время встраивая его.

Также ясно, что реализация Dictionary использует связанный список для работы с коллизий, что далеко от идеала.

Итак, мы начали реализовывать собственное решение, начав с IntHash (Dictionary)

Один очень хороший пример - код хэш-таблицы. Я немного неохотно использовал словарь .NET, поскольку он кажется громоздким (структуры для пар ключ / значение могут занимать огромный объем памяти из-за проблем с выравниванием памяти, помимо ненужной информации, хранящейся в них), и поскольку на std В библиотеке нет такой вещи, как хэш объекта, я действительно думал, что смогу немного снизить производительность, не вызывая GetHashCode и все время встраивая его.

Также ясно, что реализация Dictionary использует связанный список для работы с коллизий, что далеко от идеала.

Итак, мы начали реализовывать собственное решение, начав с IntHash (Dictionary)

Один очень хороший пример - код хэш-таблицы. Я немного неохотно использовал словарь .NET, поскольку он кажется громоздким (структуры для пар ключ / значение могут занимать огромный объем памяти из-за проблем с выравниванием памяти, помимо ненужной информации, содержащейся в них), и поскольку на std В библиотеке нет такой вещи, как хэш объекта, я действительно думал, что смогу немного снизить производительность, не вызывая GetHashCode и все время встраивая его.

Также ясно, что реализация Dictionary использует связанный список для работы с коллизий, что далеко от идеала.

Итак, мы начали реализовывать собственное решение, начав с IntHash (Dictionary) Сначала мы реализовали хеширование Hopscotch , но это действительно не очень хорошо, но было очевидно, что он не будет поддерживать очень хорошо огромные хеш-таблицы, поскольку H обычно является машинным словом, и чем больше H / Length, тем хуже производительность.

Затем мы перешли к реализации алгоритма, вдохновленного khash . У этого был большой потенциал, так как его тесты впечатляют, и он обрабатывает столкновения в том же массиве. В нем также были некоторые замечательные вещи, такие как изменение размера без необходимости в два раза больше памяти, чем мы.

Тесты разочаровали. Конечно, нет необходимости говорить, что использование памяти в нашей реализации было намного ниже, чем в Dictionary. Но я также надеялся получить хороший прирост производительности, но, к сожалению, этого не произошло. Это не было t слишком сильно ниже - менее чем на порядок - но для обоих наборов и получений реализация .NET все равно работает лучше.

Итак, мой вопрос: это лучшее, что у нас есть для C #? Я пробовал искать какое-нибудь нестандартное решение, но, похоже, его почти нет. Есть общая коллекция C5, но код настолько загроможден, что я даже не тестировал. И эталонного теста я тоже не нашел.

Так ... Это все? Должен ли я просто обернуть Словарь ?

9
задан Gama11 10 March 2019 в 14:18
поделиться