2013-05-07 1 views
0

Профилирование моего приложения Я обнаружил неприятный факт, что набрал Upadte <> (и Query <>). Builder оценивает лямбда-выражения для каждого запроса, потребляя много CPU. Вы получите несколько процентов CPU, переключение с красивой и современной типизированного UpdateBuilder <> как:Как ускорить создание типизированных строителей в 10gen официальном драйвере MongoDB C#?

var u = Update<MyPerson>.Inc(e => e.Age, Age); 

старые добрые статические строки:

var u = Update.Inc("Age", Age); 

Та же проблема с QueryBuilder <>, это также оценивает выражения для каждого запроса и бесполезно тратит ценные ресурсы ЦП.

Официальные LINQ driver's page государства:

C# компилятор транслирует все запросы, написанные с использованием синтаксиса запросов в синтаксис лямбда внутри так или иначе, так что нет никакого преимущества производительности или штраф выбор либо стиля.

Да, это правда, если вы выбираете между двумя синтаксисами LINQ. Но существует огромная разница в производительности между использованием и использованием синтаксиса LINQ. Накладные расходы зависят от того, как часто ваш клиент выполняет запросы. В моем случае разница выше 30%!

Есть ли способ получить хороший типизированный синтаксис и производительность вместе, интересно?

Простое кэширование результатов построения не является ответом, поскольку мы, очевидно, должны передавать динамические параметры для каждого запроса. Нам нужно найти способ «предварительно скомпилировать» дорогостоящую часть CPU (относительно оценки лямбда-выражений), но сохранить динамические параметры (например, индексы массива).

ответ

0

В этом пункте вы процитировали:

C# компилятор транслирует все запросы, написанные с использованием синтаксиса запросов в синтаксис лямбды внутри так или иначе, поэтому нет преимущества в производительности или штрафа выбора либо стиль.

Относится к двум синтаксисам, доступным для написания запросов LINQ.

var query = 
    from e in collection.AsQueryable<Employee>() 
    where e.FirstName == "John" 
    select e; 

или

var query = 
    collection.AsQueryable<Employee>() 
    .Where(e => e.FirstName == "John"); 

Это не означает, что LINQ запросы вообще не имеют накладные расходы. Все запросы LINQ должны быть переведены во время выполнения в эквивалентные запросы MongoDB, и для этого процесса требуется определенное количество процессорного времени.

Мы надеемся уменьшить это накладные расходы, если это возможно в будущем, но имейте в виду, что эти накладные расходы возникают только у клиента и не влияют на сервер.

+0

Да, это правильно, что касается «двух синтаксисов, доступных для написания запросов LINQ» - нет никакой разницы. Я обновил вопрос. –

+0

Но это не отвечает на главный вопрос: почему, если у нас есть определение «статических» свойств документа, нам следует страдать от выполнения довольно дорогостоящих запросов LINQ по каждому запросу? Если мой клиент работает в основном с MongoDb, он потребляет 100% процессор на своем оборудовании, имея только цель генерировать больше тепла для окружающей среды. Нет никакого смысла обрабатывать статические метаданные для каждого запроса. Я бы хотел использовать синтаксис LINQ, мне это очень нравится. Но, к сожалению, не удалось использовать его до тех пор, пока эта проблема не будет исправлена. –

+0

И с нетерпением ждут проблемы с производительностью в: сериализации документов BSON (функция MongoDB.Bson.IO.MultiChunkBuffer.WriteBackingBytes) и таких часто используемых функций, как GetCollection(), которая также потребляет несколько процентов процессора и подвергается объединению в мое приложение. Надеюсь, вы скоро настроите и настроите свой драйвер. Заранее спасибо. Я люблю тебя, водитель и люблю слышать хорошие новости о его исполнении. –