Рубрика задротские штучки.
Если вы заглядывали в репозиторий TraleBot’а, то видели там метод IsApplicable у каждой команды. Этот метод в тупую проверяет пользовательский ввод, и, если тот подходит под условия, то вызывается метод Execute у команды.
Я подумал, что было бы круто как-то ускорить все эти проверки, и вспомнил, что когда-то давно на одной работе тимлид советовал мне переписывать большие if'ы на Expression Tree. Тогда я поверил, что это всё ускоряет и вопросов не задавал, а сейчас решил проверить, а реально ли оно быстрее работает?
🅰️ Оказалось и правда быстрее. К примеру вот такое выражение
return person != null && person.Name != null && person.Age < 9;Оказалось примерно в два раза медленее, чем аналгичное скомпилированное ExpressionTree (тут неполный код, чисто для примера):
var hasNameAndAge = Expression.AndAlso(
Expression.AndAlso(
objectNotNull,
hasNameNotNull),
hasAgeLessThanParam);
SimpleCodeScenario: 2.662 ns
ExpressionsScenario: 1.213 ns
И вот я пока что-то ХЗ почему так.
P.S: код самого бенчмарка я загнал в sharplab.io, про который когда-то давно рассказывал. Вот ссылочка на него
Может кто-то знает ответ, почему так? Напишите в комменты или мне в личку, а то я так по форумам поискал, но что-то внятного ничего не нашел. Только пост на StackOverflow, где люди нашли ту же зависимость, но внятно ответить, почему так не смогли.
#петпроекты #бенчмарки