Форум breadcrumbs - Вы здесь:ФорумПрограммирование: С#ValueTask
Вы должны войти, чтобы создавать сообщения и темы.

ValueTask

Здравствуйте, есть такой код:

Спойлер

///<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]

Добрый, Overd🖐
Пожалуйста, убирайте код под спойлер.


Как оформлять свои темы и комментарии | Как делать крутые скриншоты

От того что ты делаешь сегодня, зависит то, как ты будешь жить завтра.

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

Лайкнул ЯR
ЯR
Цитата: Adler от 11.09.2022, 22:35

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

Здравствуйте, спустя время пропадают кнопки редактирования темы. Уже не могу исправить

Цитата: Adler от 11.09.2022, 22:35

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

За ни именем лучшего, хотя бы так... А так , согласен как помочь ни чего не понимая...


P.S. Код поправил, если всё правильно понял.

Лайкнул N
N
От того что ты делаешь сегодня, зависит то, как ты будешь жить завтра.

Привет 🖐

На бумаге, действительно, в контексте производительности, если используется механизм кэширования кажется более логичным использовать ValueTask для уменьшения memory allocation в managed heap и, соответственно, меньшей нагрузки на Garbage Collector.

Правда, лично для меня, здесь скорее вопрос в целесообразности и пользе такого изменения. То, что кажется логичной оптимизацией, с таким же успехом может оказаться ещё одной проблемой. Без benchmark тестов (например, в BenchmarkDotNet) и, желательно, нагрузочного тестирования API (k6), нельзя точно сказать полезно такое использование или нет, можно только попробовать угадать...

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

Более обобщённые мысли
Как правило, общая производительность системы в большей степени зависит не от эффективности кода, а от архитектуры системы, детального проектирования и выбранных инструментов.

Несколько более глобальных вопросов для размышления:

  • Есть ли какие-либо причины переживать на счёт производительности?
  • Вы рассматривали возможность использования client-side кэширования?
  • Если вы используете монолитную архитектуру, и пиковая нагрузка приходится на функциональность identity-связанных элементов системы, то имеет ли смысл объединить их в отдельный микросервис с горизонтальным масштабированием?

У меня скорее возникает вопрос относительно реализации кэширования. Как мне кажется, сам сервис кэширования должен быть обёрткой и использовать конкретный сервис в своей реализации и при этом делись общий интерфейс – пример реализации для IMemoryCache (правда, в этом случае, на уровне UI, а не Business / Application). Таким образом, вы оставляете возможность написания тестов не только для работы кэширования, но и самого сервиса.

Лайкнули Вася, Владислав и Overd
ВасяВладиславOverd