Высокая загрузка ЦП в драйвере MongoDB C# из-за JIT-компиляции BsonMemberMap.GetPropertySetter во время проецированияC#

Место общения программистов C#
Anonymous
Высокая загрузка ЦП в драйвере MongoDB C# из-за JIT-компиляции BsonMemberMap.GetPropertySetter во время проецирования

Сообщение Anonymous »

Я испытываю значительный всплеск загрузки ЦП при высокой параллельности при выполнении простой проекции AsQueryable с использованием драйвера C# MongoDB.
После профилирования приложения и отладки исходного кода драйвера я обнаружил, что узкое место возникает в методе BsonMemberMap.GetPropertySetter(). В частности, LambdaExpression компилируется каждый раз при выполнении запроса, вызывая чрезмерную активность JIT.

Код: Выделить всё

 BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); });
BsonClassMap.RegisterClassMap(cm => { cm.AutoMap(); });

var client = new MongoClient(connectionString);

var db = client.GetDatabase("WebApplication");

var collection = db.GetCollection("DynamicApplication");

for(int i=0; i p.Id == "003566cd-3a51-4a24-9842-c32b01db0600")
.Select(p => new GetDbCodesRespDto
{
AppId = p.InternalId,
DbCode = p.DbCode
})
.ToListAsync();
}

Проблема: Несмотря на то, что структура DTO и логика проекции остаются неизменными, драйвер, похоже, перекомпилирует IL для установщиков свойств при каждом запросе.
Версия драйвера MongoDB .NET: 3.7.1
Состояние JIT
Изображение

------------------------------------------------------------------------------Обновлено------------------------------------------------
Изображение

Это обходной путь, который я нашел на данный момент:

Код: Выделить всё

d = await collection.Find(p => p.Id == "003566cd-3a51-4a24-9842-c32b01db0600")
.Project(
Builders.Projection
.Include("InternalId")
.Include("DbCode"))
.ToListAsync();

var result = d.Select(p => new GetDbCodesRespDto
{
AppId = p.InternalId,
DbCode = p.DbCode
}).ToList();
В такой проекции кажется, что BsonMemberMap.GetPropertySetter() DynamicApplication уже кэширован, поэтому лямбдаExpression.Compile() не выполняется каждый раз.

Вернуться в «C#»