2015-04-02 5 views
2

У меня есть тестовое задание для оптимизации лямбда-выражения во время выполнения. Предполагая, что лямбда содержит некоторые «тяжелые» вызовы функций, мне нужно изменить лямбда так, чтобы все вызовы функций были кэшированы во временные переменные, которые затем могут заменять фактические вызовы функций в теле лямбда.Как оптимизировать лямбду во время выполнения?

Должна быть функция, которая получает лямбду в качестве параметра и возвращает оптимизированную лямбду, которую вы можете вызвать тогда.

Интересно, какой раздел C# это вообще? Я имею в виду, например, «узнать о размышлениях» или «узнать о дженериках». Что мне нужно узнать в этом случае?

+0

Expression Trees - это отдельная глава книг C#. Он полусвязан с рефлексией (что вам нужно знать хотя бы немного). Он только касательно связан с дженериками (только потому, что вам может понадобиться отразить общие методы :-), а выражение Expression.Lambda <> 'использует generics ... так что оно больше связано со строками или массивами, чем с дженериками) – xanatos

+0

Вы можете найти [Memoization] (http://en.wikipedia.org/wiki/Memoization), это, кажется, проблема здесь. –

+0

не являются выражениями lamdba, скомпилированными во время выполнения? – Ewan

ответ

0

Думаю, Memoization это техника, которую вы ищете.

Вот статья, в которой объясняется, как вы можете достичь memoization in c# using generics and lambda expression.

Наконец, вы можете найти фактическую реализацию техники в ReactiveUIMemoizingMRUCache.

+1

Между тем, зная имя шаблона и записывая редиректор дерева выражений для него, расстояние довольно велико. – xanatos

+1

Ну, это, на мой взгляд, начало. :) Я пойду попытаюсь что-то узнать ... – yaapelsinko

2

Если ваши вызовы тяжелых функций не равны deterministic, и вы можете доказать, что они всегда вызываются с одинаковыми параметрами, вы не можете этого сделать.

Например, в C#

var lst = new List<string> { "Foo", "Bar" }; 

bool r1 = lst.Remove("Foo"); // true, and has modified lst 
bool r2 = lst.Remove("Foo"); // false, and hasn't modified lst 

bool r3 = lst.Remove("Bar"); // true, and has modified lst, note different parameter 
bool r4 = lst.Remove("Baz"); // false, and hasn't modified lst, note different parameter 

Как вы можете обнаружить, если Remove детерминированной или нет? Вы не можете (технически вы могли бы разобрать его и проверить, но это очень сложно) ... И как вы могли бы определить, вызваны ли они теми же параметрами? Это выполнимо, но довольно сложно.

Теперь ... как тестовое задание ... Я вижу три возможности:

  • это ложный тест, где вы должны понять это и сообщить об этом
  • вы не поняли тест работа
  • вы не дали нам некоторые важные информации (например, что вы должны заменить некоторые конкретные вызовы методов, которые не имеют параметров и являются статическими или нечто подобное, и что гарантированно быть детерминированным)
+0

@yaapelsinko И как вы можете проверить, что x a y постоянны и не меняются посередине? – xanatos

+1

@xanatos - когда предположение состоит в том, что F детерминирован, все, что вам нужно, это значения _starting_ x и y. –

+0

@HenkHolterman Что? Нет, функция детерминирована на основе параметров. Если вы меняете параметры, результат изменяется.* детерминированный алгоритм - это алгоритм, который при заданном вводе всегда будет производить тот же вывод * (из вики) ... Пример ... Добавить (1, 2) == 3, Добавить (1, 3) = = 5, Добавить (1, 2) == 3, Добавить (1, 2) == 3, Добавить (1, 2) == 3 ... Добавить детерминирован, но если он изменит параметры, результат изменится – xanatos