CSHARP_GEPARD Telegram 156
Маленький словарь #скорость #память

Часто бывает, что мы получаем данные из внешнего источника или БД, создаём временный словарь, ищем по нему, а потом про него забываем. Часто бывает, что приходящих данных мало, например, 10-15 элементов.

При этом, многие помнят, что поиск по словарю при небольшом количестве элементов не всегда эффективен (поиск по массиву будет быстрее). Также, те коллеги, которые помнят устройство Dictionary, могут вспомнить, что эта структура данных имеет два внутренних массива, выделение которых на горячих направлениях кода может вызвать неплохой memory pressure. Например, создание одного словаря размером в 10 элементов - почти 1кб памяти.

В принципе, решение задачи лежит на поверхности.

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

Я набросал небольшой пример, который проще прочитать, чем пояснять. Из интересного там только Enumerator, который хранит сразу два Enumerator'a для разных случаев (массив и словарь). Не реализовано удаление, на которое у меня просто не хватило времени, и специальные методы для превращения в ToDictionary, ToList, ToArray - их можно написать эффективнее, чем те, которые есть в классе Enumerable. Но, я думаю, что это не проблема для тех, кто понял концепцию.

Сам бенчмарк охватывает сценарий, который описан выше: создаём словарь, ищем ключи, используем словарь для linq операции. В моём примере, возвращение переиспользуемого массива и словаря реализовано через Dispose, который нужно не забывать вызывать, либо просто использовать using.

Как видно из прикреплённой картинки, прирост производительности для количества элементов меньше 20 что-то около 20%. Ну и zero-allocation, конечно. Почему при 50 элементах всё равно существует опережение по скорости - я оставлю на самостоятельное исследование. Не исключена банальная ошибка.
👍205



tgoop.com/csharp_gepard/156
Create:
Last Update:

Маленький словарь #скорость #память

Часто бывает, что мы получаем данные из внешнего источника или БД, создаём временный словарь, ищем по нему, а потом про него забываем. Часто бывает, что приходящих данных мало, например, 10-15 элементов.

При этом, многие помнят, что поиск по словарю при небольшом количестве элементов не всегда эффективен (поиск по массиву будет быстрее). Также, те коллеги, которые помнят устройство Dictionary, могут вспомнить, что эта структура данных имеет два внутренних массива, выделение которых на горячих направлениях кода может вызвать неплохой memory pressure. Например, создание одного словаря размером в 10 элементов - почти 1кб памяти.

В принципе, решение задачи лежит на поверхности.

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

Я набросал небольшой пример, который проще прочитать, чем пояснять. Из интересного там только Enumerator, который хранит сразу два Enumerator'a для разных случаев (массив и словарь). Не реализовано удаление, на которое у меня просто не хватило времени, и специальные методы для превращения в ToDictionary, ToList, ToArray - их можно написать эффективнее, чем те, которые есть в классе Enumerable. Но, я думаю, что это не проблема для тех, кто понял концепцию.

Сам бенчмарк охватывает сценарий, который описан выше: создаём словарь, ищем ключи, используем словарь для linq операции. В моём примере, возвращение переиспользуемого массива и словаря реализовано через Dispose, который нужно не забывать вызывать, либо просто использовать using.

Как видно из прикреплённой картинки, прирост производительности для количества элементов меньше 20 что-то около 20%. Ну и zero-allocation, конечно. Почему при 50 элементах всё равно существует опережение по скорости - я оставлю на самостоятельное исследование. Не исключена банальная ошибка.

BY C# Heppard




Share with your friend now:
tgoop.com/csharp_gepard/156

View MORE
Open in Telegram


Telegram News

Date: |

The court said the defendant had also incited people to commit public nuisance, with messages calling on them to take part in rallies and demonstrations including at Hong Kong International Airport, to block roads and to paralyse the public transportation system. Various forms of protest promoted on the messaging platform included general strikes, lunchtime protests and silent sit-ins. Read now Telegram channels fall into two types: How to Create a Private or Public Channel on Telegram? Judge Hui described Ng as inciting others to “commit a massacre” with three posts teaching people to make “toxic chlorine gas bombs,” target police stations, police quarters and the city’s metro stations. This offence was “rather serious,” the court said.
from us


Telegram C# Heppard
FROM American