Однако есть одно существенное замедление: параметры обратного вызова
Вы действительно тестировали это? Я сомневаюсь, что построение значений аргумента - это дорого. Обратите внимание, что если это действительно интенсивно используемый вызов, V8 может включить его и затем оптимизировать неиспользуемые значения аргумента.
В идеале NodeJs представит параметры обратного вызова, как определено обратным вызовом.
На самом деле, это . Однако если вы действительно хотите полагаться на это свойство, вам следует правильно задокументировать, что вы делаете, в противном случае это волшебство c может привести к неясным ошибкам.
Мы могли бы ввести различный обратный вызов для каждой комбинации параметров , Это звучит как плохая идея.
Похоже, не так уж и сложно обеспечить два варианта: filter(key, value)
и filterDetailed(key, value, context)
. Если оптимизация действительно того стоит, и, как вы говорите, это библиотека низкого уровня, просто для нее go.
Вместо прямой передачи параметров, мы могли бы передать функцию для каждого параметра, который вычисляет и возвращает значение параметра. Внутри обратного вызова параметр будет вызываться по мере необходимости. Это уродливо, но может быть лучшим подходом?
Построение объекта замыкания для передачи вместо параметра также имеет некоторые накладные расходы, поэтому вам нужно будет правильно его сравнить. Возможно, это того не стоит.
Однако я вижу, что вы фактически передаете один объект контекста в качестве аргумента, к которому к вычисленным значениям обращаются как к свойствам. В этом случае вы можете просто сделать эти свойства получателями, которые будут вычислять значение при обращении к ним, а не при создании объекта.