Я кодирую вычислительно дорогое приложение (задача обучения машинам NLP), которая нуждается в оптимизации.Оптимизация Dictionary.TryGetValue()
Поскольку в моем коде есть много петель, я использовал Parallel.For
(и варианты), чтобы распараллелить самые внешние петли. Я также использовал массивы и Dictionary
s, чтобы построить несколько индексов, которые значительно сократили стоимость.
Профилировщик VS2010 указал, что приложение проводит большую часть времени в Dictionary.TryGetValue()
(что является побочным продуктом индексов).
Это задает вопрос, могу ли я сделать лучше? И как?
Мой первый вопрос: существует ли общее мнение, что ConcurrentDictionary.TryGetValue
работает лучше, чем Dictionary.TryGetValue
в моем сценарии - много читателей, нет писателей?
Я не мотивирован, чтобы закодировать свой собственный хэшмап, поскольку он, вероятно, будет хуже, чем коллекции .NET. Но есть ли там библиотеки, которые гарантируют быстрый поиск моего сценария?
Возможно, реализация hashcode замедляет работу?
'O (1)' не совсем то же самое, что «очень хорошо оптимизирован». Я могу добавить 'Thread.Sleep (60000)' в начало метода и все еще законно утверждать, что он был «O (1)»; p –
Да, вы можете, но если вы после максимальной производительности вы не будете;) Я имею в виду, что метод ** TryGetValue ** вряд ли приведет к замедлению работы, но метод ** GetHashCode ** может делать это, если не правильно закодирован. –
Я профилировал метод GetHashCode, и программа тратит на него менее 0,1% времени. Думаю, мне нужно подойти к этому узкому месту по-другому. – Howie