ValueTask
Цитата: Overd от 11.09.2022, 21:50Здравствуйте, есть такой код:
[spoiler title=""]///<inheritdoc /> public class CacheService : ICacheService { private readonly IUnitOfWork _unitOfWork; private readonly IConfigurationProvider _configurationProvider; private readonly IMemoryCache _cache; public CacheService(IUnitOfWork unitOfWork, IConfigurationProvider configurationProvider, IMemoryCache cache) {_unitOfWork = unitOfWork; _configurationProvider = configurationProvider; _cache = cache; } ///<inheritdoc /> public async ValueTask<RoleDto[]> GetRoleReference() {var rolesReferenceKey = "rolesRef"; if (!_cache.TryGetValue(rolesReferenceKey, out RoleDto[] roles)) {roles = await _unitOfWork.RoleRepository.GetAll().ProjectTo<RoleDto>(_configurationProvider).ToArrayAsync(); if (roles.Length > 0) _cache.Set(rolesReferenceKey, roles, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(1))); } return roles; } }[/spoiler]
В методеGetRoleReferenceя используя тип ValueTask для улучшения производительности, т.к. здесь мы получаем справочник ролей очень часто из кеша. Хотел спросить у вас, правильно ли я реализовал в этот метода использование ValueTask? Заранее благодарю.[/spoiler]
Здравствуйте, есть такой код:
///<inheritdoc />
public class CacheService : ICacheService
{ private readonly IUnitOfWork _unitOfWork;
private readonly IConfigurationProvider _configurationProvider;
private readonly IMemoryCache _cache;
public CacheService(IUnitOfWork unitOfWork, IConfigurationProvider configurationProvider, IMemoryCache cache)
{_unitOfWork = unitOfWork;
_configurationProvider = configurationProvider;
_cache = cache;
}
///<inheritdoc />
public async ValueTask<RoleDto[]> GetRoleReference()
{var rolesReferenceKey = "rolesRef";
if (!_cache.TryGetValue(rolesReferenceKey, out RoleDto[] roles))
{roles = await _unitOfWork.RoleRepository.GetAll().ProjectTo<RoleDto>(_configurationProvider).ToArrayAsync();
if (roles.Length > 0)
_cache.Set(rolesReferenceKey, roles, new MemoryCacheEntryOptions().SetAbsoluteExpiration(TimeSpan.FromMinutes(1)));
}
return roles;
}
}
В методе СкопированоGetRoleReference я используя тип ValueTask для улучшения производительности, т.к. здесь мы получаем справочник ролей очень часто из кеша. Хотел спросить у вас, правильно ли я реализовал в этот метода использование ValueTask? Заранее благодарю.[/spoiler]
Цитата: Игорь от 11.09.2022, 21:58Добрый, Overd🖐
Пожалуйста, убирайте код под спойлер.
Как оформлять свои темы и комментарии | Как делать крутые скриншоты
Добрый, Overd🖐
Пожалуйста, убирайте код под спойлер.
Как оформлять свои темы и комментарии | Как делать крутые скриншоты
Цитата: Adler от 11.09.2022, 22:35Приветствую.
Я бы не под спойлер порекомендовал его убрать, а оформить нормально как код предварительно отформатировав, т.к. это невозможно читать, а понять тем более.
Приветствую.
Я бы не под спойлер порекомендовал его убрать, а оформить нормально как код предварительно отформатировав, т.к. это невозможно читать, а понять тем более.
Цитата: Overd от 11.09.2022, 22:42Цитата: Adler от 11.09.2022, 22:35Приветствую.
Я бы не под спойлер порекомендовал его убрать, а оформить нормально как код предварительно отформатировав, т.к. это невозможно читать, а понять тем более.Здравствуйте, спустя время пропадают кнопки редактирования темы. Уже не могу исправить
Цитата: Adler от 11.09.2022, 22:35Приветствую.
Я бы не под спойлер порекомендовал его убрать, а оформить нормально как код предварительно отформатировав, т.к. это невозможно читать, а понять тем более.
Здравствуйте, спустя время пропадают кнопки редактирования темы. Уже не могу исправить
Цитата: Игорь от 11.09.2022, 23:41Цитата: Adler от 11.09.2022, 22:35Приветствую.
Я бы не под спойлер порекомендовал его убрать, а оформить нормально как код предварительно отформатировав, т.к. это невозможно читать, а понять тем более.За ни именем лучшего, хотя бы так... А так , согласен как помочь ни чего не понимая...
P.S. Код поправил, если всё правильно понял.
Цитата: Adler от 11.09.2022, 22:35Приветствую.
Я бы не под спойлер порекомендовал его убрать, а оформить нормально как код предварительно отформатировав, т.к. это невозможно читать, а понять тем более.
За ни именем лучшего, хотя бы так... А так , согласен как помочь ни чего не понимая...
P.S. Код поправил, если всё правильно понял.
Цитата: Dapofig от 12.09.2022, 10:31Привет 🖐
На бумаге, действительно, в контексте производительности, если используется механизм кэширования кажется более логичным использовать ValueTask для уменьшения memory allocation в managed heap и, соответственно, меньшей нагрузки на Garbage Collector.
Правда, лично для меня, здесь скорее вопрос в целесообразности и пользе такого изменения. То, что кажется логичной оптимизацией, с таким же успехом может оказаться ещё одной проблемой. Без benchmark тестов (например, в BenchmarkDotNet) и, желательно, нагрузочного тестирования API (k6), нельзя точно сказать полезно такое использование или нет, можно только попробовать угадать...
Если анализ производительности покажет реальные проблемы, тогда и будет целесообразность потенциального использования ValueTask.
[spoiler title="Более обобщённые мысли"]Как правило, общая производительность системы в большей степени зависит не от эффективности кода, а от архитектуры системы, детального проектирования и выбранных инструментов.
Несколько более глобальных вопросов для размышления:
- Есть ли какие-либо причины переживать на счёт производительности?
- Вы рассматривали возможность использования client-side кэширования?
- Если вы используете монолитную архитектуру, и пиковая нагрузка приходится на функциональность identity-связанных элементов системы, то имеет ли смысл объединить их в отдельный микросервис с горизонтальным масштабированием?
У меня скорее возникает вопрос относительно реализации кэширования. Как мне кажется, сам сервис кэширования должен быть обёрткой и использовать конкретный сервис в своей реализации и при этом делись общий интерфейс – пример реализации для IMemoryCache (правда, в этом случае, на уровне UI, а не Business / Application). Таким образом, вы оставляете возможность написания тестов не только для работы кэширования, но и самого сервиса.[/spoiler]
Привет 🖐
На бумаге, действительно, в контексте производительности, если используется механизм кэширования кажется более логичным использовать ValueTask для уменьшения memory allocation в managed heap и, соответственно, меньшей нагрузки на Garbage Collector.
Правда, лично для меня, здесь скорее вопрос в целесообразности и пользе такого изменения. То, что кажется логичной оптимизацией, с таким же успехом может оказаться ещё одной проблемой. Без benchmark тестов (например, в BenchmarkDotNet) и, желательно, нагрузочного тестирования API (k6), нельзя точно сказать полезно такое использование или нет, можно только попробовать угадать...
Если анализ производительности покажет реальные проблемы, тогда и будет целесообразность потенциального использования ValueTask.
Несколько более глобальных вопросов для размышления:
- Есть ли какие-либо причины переживать на счёт производительности?
- Вы рассматривали возможность использования client-side кэширования?
- Если вы используете монолитную архитектуру, и пиковая нагрузка приходится на функциональность identity-связанных элементов системы, то имеет ли смысл объединить их в отдельный микросервис с горизонтальным масштабированием?
У меня скорее возникает вопрос относительно реализации кэширования. Как мне кажется, сам сервис кэширования должен быть обёрткой и использовать конкретный сервис в своей реализации и при этом делись общий интерфейс – пример реализации для IMemoryCache (правда, в этом случае, на уровне UI, а не Business / Application). Таким образом, вы оставляете возможность написания тестов не только для работы кэширования, но и самого сервиса.