У меня есть система, которая генерирует деревья решений и преобразует их во вложенные операторы Common Lisp if
с предикатами, которые проверяют, является ли значение переменной >=
или <=
заданным целым числом, например
(LAMBDA (V1 V2)
(IF (>= V1 2)
(IF (<= V1 3)
(IF (<= V2 3)
(IF (>= V2 2) 16 (IF (>= V2 1) 6 0))
(IF (<= V2 4) 10 0))
(IF (<= V1 4)
(IF (>= V2 1) (IF (<= V2 3) 6 0) 0)
0))
(IF (>= V1 1)
(IF (>= V2 2) (IF (<= V2 4) 10 0) 0)
0)))
Затем я использую eval
для компиляции кода на Лиспе, создавая функции, которые работают намного быстрее, чем интерпретация исходного дерева решений.Этот этап компиляции занимает удивительно много времени: функция с 5000 вложенными ifs компилируется за минуту (в Clozure Common Lisp на powerbook), хотя генерация оператора if заняла около 100 миллисекунд.Почему такая простая структура занимает так много времени?Могу ли я что-нибудь сделать, чтобы существенно ускорить процесс, возможно, какое-нибудь заявление?Буду очень признателен за любые указатели, которые вы можете предложить.