Я должен быть обеспокоен скоростью словаря.NET?

Указание типа как строки в порядке, но всегда немного меня решает, что мы в основном обходим парсер. Поэтому вам лучше не пропустить ни одну из этих литералов:

def __add__(self, other: 'Position') -> 'Position':
    return Position(self.x + other.x, self.y + other.y)

Небольшое отклонение заключается в использовании связанного типаvar, по крайней мере, тогда вы должны написать строку только один раз при объявлении typevar:

from typing import TypeVar

T = TypeVar('T', bound='Position')

class Position:

    def __init__(self, x: int, y: int):
        self.x = x
        self.y = y

    def __add__(self, other: T) -> T:
        return Position(self.x + other.x, self.y + other.y)
25
задан John Saunders 14 December 2009 в 20:22
поделиться

11 ответов

  1. Вы являются микрооптимизирующими. У вас еще есть рабочий код? Помните: «Если он не работает, не имеет значения, насколько быстро он не работает». (Мич Равера) http://www.codingninja.co.uk/best-programmers-quotes/ .

    Вы не представляете, где будут узкие места, и уже сосредоточились на Словаре. Что, если проблема в другом?

  2. Как узнать, как реализован класс Dictionary? Может быть, он уже использует массив с хешированными ключами!

PS На самом деле это «словари .NET», а не «словари C #», потому что C # - всего лишь один из нескольких языков программирования, использующих фреймворк .

]
79
ответ дан 28 November 2019 в 17:33
поделиться

Вы можете захотеть взглянуть на класс KeyedCollection в System.ObjectModel. Из описания MSDN «предоставляет абстрактный базовый класс для коллекции, ключи которой встроены в значения».

-3
ответ дан Anton 15 October 2019 в 14:44
поделиться

Здравствуйте, я буду создавать проект который будет использовать поиск по словарю и вставок совсем немного. Это что-то о чем беспокоиться?

Да. Всегда разумно заранее учитывать факторы производительности.

Ваша озабоченность должна иметь следующую форму: ваша озабоченность должна побуждать вас к написанию реалистичных, ориентированных на пользователя характеристик производительности. Это должно побуждать вас начинать писать тесты производительности как можно раньше и часто их запускать, чтобы вы могли видеть, как каждое отдельное изменение продукта влияет на производительность. Таким образом вы будете немедленно проинформированы, когда изменение кода повлечет за собой изменение производительности, влияющее на пользователя. И это должно побуждать вас часто запускать профили, чтобы вы рассуждали о производительности, основываясь на эмпирических измерениях, а не на случайных предположениях и догадках.

Кроме того, если я провожу сравнительный анализ и тому подобное и это действительно плохо, то что за лучший способ заменить словарь на что-нибудь еще?

Лучший способ сделать это - создать разумный уровень абстракции. Если у вас есть класс (или интерфейс), который представляет абстрактный тип данных «вставка» и «поиск», то вы можете заменить его внутренние компоненты, не меняя ни одного из вызывающих.

Обратите внимание, что добавление уровня абстракции само по себе имеет производительность Стоимость. Если ваше профилирование показывает, что уровень абстракции слишком дорог, если дополнительная пара наносекунд на вызов слишком велика, вам, возможно, придется избавиться от уровня абстракции. Опять же, это решение будет основано на реальных данных о производительности.

Можно ли использовать массив с "хешированием" ключи даже быстрее? Это не но поможет ли время вставки?

Ни вы, ни кто-либо другой, читающий это, возможно, не сможете узнать, какой из них быстрее, пока вы не напишете его в обе стороны, а затем не проведете тест в обоих направлениях в реальных условиях . Выполнение этого в «лабораторных» условиях исказит ваши результаты; вам нужно понять, как все работает, когда сборщик мусора испытывает реальную нехватку памяти и так далее. Вы также можете спросить нас, какая лошадь будет бежать быстрее в Кентукки Дерби в следующем году. Если бы мы знали ответ, просто взглянув на гоночную форму, мы все уже были бы богаты. Вы не можете ожидать, что кто-то узнает, какой из двух полностью гипотетических, неписаных фрагментов кода будет быстрее при неуказанных условиях!

66
ответ дан 28 November 2019 в 17:33
поделиться

Словарь Класс фактически реализован в виде хеш-таблицы, которая делает поиск очень быстрым (близким к O (1)). См. документацию по API для получения дополнительной информации. Я сомневаюсь, что вы могли бы сделать лучшую реализацию самостоятельно.

10
ответ дан 28 November 2019 в 17:33
поделиться

Подождите и посмотрите, ниже ли производительность вашего приложения
Если это так, то используйте профилировщик, чтобы определить, является ли поиск в словаре источником проблемы
Если это так, то проведите несколько тестов с репрезентативными данными , чтобы увидеть, будет ли другой выбор списка быстрее.

Вкратце - нет , в общем, вам не следует беспокоиться о выполнение деталей реализации до тех пор, пока у вас не возникнет проблема.

10
ответ дан 28 November 2019 в 17:33
поделиться

Я бы проверил словарь, HashTable (HashSet в .NET) и, возможно, домашний класс, и посмотрел, какой из них лучше всего работает в типичных условиях использования.

Обычно Я бы сказал, что все в порядке (вставьте здесь любимую цитату из StackOverflow о преждевременной эякуляции), , но если это основная часть приложения, Тест, Тест, Тест.

5
ответ дан 28 November 2019 в 17:33
поделиться

Посмотрите на Использование C # HybridDictionary

Класс HybridDictionary

Этот класс рекомендуется для случаев где количество элементов в словарь неизвестен. Занимает преимущество улучшенной производительности ListDictionary с небольшими коллекции и предлагает гибкость перехода на Hashtable, который обрабатывает большие коллекции лучше, чем ListDictionary

1
ответ дан 28 November 2019 в 17:33
поделиться

You may consider using the C5 library. I've found it to be very fast and thoughtfully designed. Others on stackoverflow have found the same. With C5 you have the option of using general type interfaces (with a captial I), or directly the data structures underneath. Naturally the interfaces allow you to swap out different implementations, but I have found in performance testing that the interfaces will cost you.

0
ответ дан 28 November 2019 в 17:33
поделиться

Я не уверен, что кто-то еще действительно ответил на эту часть:

Кроме того, если я провожу сравнительный анализ и тому подобное и это действительно плохо, то что за лучший способ заменить словарь на something else?

For this, wherever possible, declare your variables as IDictionary. That's the main interface that Dictionary derives from. (I'm assuming that if you care that much about performance, then you aren't considering non-generic collections.) Then, in the future, you can change the underlying implementation class without having to change any of the code that uses that dictionary. For example:

IDictionary<string, int> myDict = new Dictionary<string, int>();
4
ответ дан 28 November 2019 в 17:33
поделиться

Единственное, о чем я могу думать, это то, что скорость словаря зависит от класса ключа, имеющего достаточно быстрый метод GetHashCode. Поиск и вставка выполняются очень быстро, поэтому у вас не должно возникнуть никаких проблем.

Что касается использования массива, то это уже делает класс Dictionary. На самом деле он использует два массива: один для ключей и один для значений.

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

4
ответ дан 28 November 2019 в 17:33
поделиться

Если ваше приложение многопоточное, то ключевой частью производительности будет правильная синхронизация этого словаря.

Если он однопоточный, то почти наверняка узкое место будет где-то еще. Например, чтение этих объектов, где бы вы их ни читали.

2
ответ дан 28 November 2019 в 17:33
поделиться
Другие вопросы по тегам:

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