Я пишу цель для Haxe C # и изучаю различия в производительности для библиотеки std Haxe, чтобы мы могли обеспечить максимальную производительность благодаря кроссплатформенному коду.
Один очень хороший пример -код хеш-таблицы.Я немного неохотно пользовался словарем .NET, так как он кажется громоздким (структуры для пар ключ / значение могут занимать огромный объем памяти из-за проблем с выравниванием памяти, помимо ненужной информации, хранящейся в нем), а также из-за stdВ библиотеке нет такого понятия, как хэш объекта, я действительно думал, что смогу немного снизить производительность, не вызывая GetHashCode и вставляя его все время.
Также ясно, что реализация Dictionary использует связанный списокиметь дело с коллизиями, что далеко от идеала.
Итак, мы начали реализовывать наше собственное решение, начиная с IntHash (словарь). Сначала мы реализовали хеширование Hopscotch , но оно действительно неполучилось очень хорошо, но было очевидно, что он не очень хорошо поддерживал бы огромные хеш-таблицы, поскольку обычно H - машинное слово, а с увеличением H / Length производительность ниже.
Мызатем перешел к реализации алгоритма, вдохновленного khash .У этого был большой потенциал, так как его тесты впечатляют, и он обрабатывает столкновения в одном массиве.У него также были некоторые замечательные вещи, такие как изменение размера без необходимости вдвое больше памяти, чем было бы.
Тесты разочаровали.Конечно, нет нужды говорить, что в нашей реализации использование памяти было намного ниже, чем в словаре.Но я также надеялся получить хороший прирост производительности, но, к сожалению, это был не тот случай.Это было не слишком далеко внизу - менее чем на порядок - но для обоих подходов реализация .NET по-прежнему работала лучше.
Итак, мой вопрос: это лучшее, что у нас есть для C #?Я пытался найти любое нестандартное решение, и, похоже, его почти нет.Существует общая коллекция C5, но код настолько перегружен, что я даже не тестировал.И я также не нашел эталон.
Итак ... Это так?Должен ли я просто обернуть вокруг Dictionary<>
?