C# Оптимизация оперативной памяти

preview_player
Показать описание
В этом видео покажу способы оптимизации оперативной памяти.
nuget: AlexanderZhelnin.SAT.WeakEvents
видео по тому что умеет C# и не умеет Java:
Рекомендации по теме
Комментарии
Автор

Спасибо Александр, очень круто и полезно! Хоть я и новичок))

СерегаБ-бн
Автор

В одном проекте была у меня реализация интернированной строки вместо String типа.
не только в целях оптимизации памяти, но еще надо было сравнивать/искать эти строки
а для интернированыхх строк сравнение(на равенство) сводится к сравнению ссылок,
т.к в во внутренний пул интернировааные строки запихиваются используя ordinal сравнение (побайтно)
это нам вполне подходило.
хороший канал - лайк, подписка ))

andreyt
Автор

Классное видео, а можно подробнее про диагностику в целом сделать видео?

vinogradova
Автор

👌К активному применению. Единственным минусом данного финта представляется большее потребление процессорного времени на поиск в кэше в приложениях с активным созданием/удалением объектов с такими строками. Тут кому что важнее, как говорится.

sivtsev
Автор

Добрый день, а почему бы не сделать 1 ConcurrentDictionary<string, string>?
Идея такая, что при установки значения, мы по ключу ищем значение, если оно там есть, то мы используем его(интернированную строку), если его нет, то мы добавляем её следующим образом
map.TryAdd(strValue, strValue);
Т.е мы избавляемся от 2х словарей и уменьшаем количество потребляемой оперативной памяти + ускоряем работу этого кэша

blowin
Автор

Спасибо, очень интересно
Вместо обжекта который хранит лист или дикшнри было бы лучше сделать через полиморфизм как State паттерн чтобы без кастов было? По идее должно быть чутка быстрее. + имплементацию делать структурой а не объектом чтоб вызовы были быстрее и jit оптимизация получше.

stridemann
Автор

Вдруг кому пригодится реализация на HashSet<string>:

public struct StringCache
{
private string cachedStr;

public static implicit operator string(StringCache s) => s.cachedStr;

public static explicit operator StringCache(string str) =>
new() { cachedStr = str) };

public static string[] CacheArray(string[] arr)
{
for (int i = 0; i < arr.Length; i++)
arr[i] = arr[i]);

return arr;
}

public static void ClearCache() =>

public override string ToString() => cachedStr;
}

internal class StringCacheManager : IDisposable
{
public static readonly StringCacheManager Instance = new();
private readonly HashSet<string> cacheStorage = new();
private readonly ReaderWriterLockSlim cacheLock = new();

public bool IsDisposed { get; private set; }

private StringCacheManager()
{
Debug.Assert(Instance == null, "Should be one instance of StringCacheManager");
}

public string Cache(ref string str)
{
if (IsDisposed)
throw new

if (string.IsNullOrEmpty(str))
return String.Empty;


cacheLock.EnterReadLock();
try
{
if (cacheStorage.TryGetValue(str, out var cacheStr))
return cacheStr;
}
finally
{
cacheLock.ExitReadLock();
}

cacheLock.EnterWriteLock();
try
{
if(cacheStorage.Add(str))
return str;

if (cacheStorage.TryGetValue(str, out var cacheStr))
return cacheStr;
}
finally
{
cacheLock.ExitWriteLock();
}

return str;
}

public void ClearCache()
{
if (IsDisposed)
throw new

cacheLock.EnterWriteLock();
try
{
cacheStorage.Clear();
}
finally
{
cacheLock.ExitWriteLock();
}
}

public void Dispose()
{
cacheLock?.Dispose();
IsDisposed = true;
}
}

konstantinshapovalov
Автор

Не совсем понимаю, где это вы в базе столько одинаковых строк нарыли

meosaganami
Автор

Ушел от рич модели классов на анемик. Подобных проблем нет, так как нет самой необходимости в событиях 😂
Ооп это зло.

АнтонБ-ху
Автор

Будьте добры, кто-нибудь, объясните строку
**public int this[string value]**

Bont
Автор

Очень напрягает затыки звука. Резко пропадает звук. Заставляет напрагяться

Bont