Предположим, что метод имеет необязательный аргумент Action
или Func<T, T>
, который обычно будет значением по умолчанию null
. Это обычно выражение lambda-null
будет вызываться много раз.Должны ли заменяемые аргументы лямбда заменить прозрачными реализациями?
В этой ситуации, это лучше:
Null проверить лямбда-выражение перед каждым использованием, или ...
а. Вызовите нулевое значение
Action
используяaction?.Invoke()
.b. Преобразование с нулевым вызовом
Func<T, T>
-transform == null ? value : transform(value)
.... null-проверить выражение один раз при вызове метода, а затем заменить его на прозрачный вариант?
a. Заменить
null
Action
сnew Action(() => { })
.b. Заменить
null
Func<T, T>
сnew Func<T, T>((T value) => { return value; })
.
Для этого вопроса, пожалуйста, предположим:
Это глубоко вложенным математике код, поэтому его производительность актуальна.
Читаемость кода не имеет существенного влияния.
Я задаю этот вопрос, потому что я часто имеют методы, позволяющие для дополнительных лямбда-выражений, которые невероятно полезны, но я никогда не уверен, если я должен null
-check их декларации, или если я должен просто null
- проверьте их при каждом потенциальном использовании.
Я предполагаю, что если выражение лямбда будет выполняться только один раз, тогда лучше всего всего null
-учреждение в этой точке.
Но мне интересно, когда метод создает объект, который будет многократно называть лямбда-выражение. Предполагая, что аргумент обычно будет null
, тогда, похоже, этот вопрос сводится к более простому вопросу: быстрее ли это null
-Чтобы проверить лямбда или выполнить то, что ничего не делает?
[Гонка ваших лошадей] (https://ericlippert.com/2012/12/17/performance-rant/) –
@ RenéVogt Ха-ха, это хороший момент, и почему я указываю, что производительность важна в этот случай (поскольку люди часто спрашивают о производительности, когда это даже не имеет значения). Но, как отмечает EricLippert в этом блоге, трудно получить значащие тесты из собранной мусором, JIT-скомпилированной среды исполнения. Итак, я надеюсь на некоторое понимание общей природы выполнения прозрачной лямбды (может ли JIT оптимизировать ее в логике оптимизации мертвого кода?) По сравнению с нулевой проверкой (которая является ветвящейся операцией, которая может испортить Предсказатель ветвления процессора). [...] – Nat
@ RenéVogt [...] И поскольку это сложный компромисс, который зависит от основных обобщений (например, как работает JIT-er и что влияет на предиктор отрасли процессора), я надеялся, что кто-то со знанием эти вопросы могли бы прокомментировать это. Хотя я подозреваю, что это может иметь существенное влияние, если один метод реализуется на протяжении всего проекта по сравнению с другим, я не уверен, что я получу значимые результаты, просто перейдя по одному по сравнению с другим методом быстрой проверки с помощью таймер прилагается. – Nat