Я работаю над аналитической системой Scala (http://www.hiringthing.com), и я обнаружил, что часто задаю себе следующий вопрос. Учитывая «чистую» функцию без побочных эффектов, если я дважды ударяю эту функцию с теми же входами, могу ли я ожидать, что компилятор будет повторно использовать значение, сгенерированное с первого запуска, или снова проведет весь код. Иными словами, первый пример ниже более эффективный, чем второй?Насколько эффективен компилятор Scala для повторного использования результатов известных функций?
def add(x: Int, y: Int) = x + y * 10000000000
val a = add(1,2)
do_something(a)
do_another_thing(a)
против
def add(x: Int, y: Int) = x + y * 10000000000
do_something(add(1,2))
do_another_thing(add(1,2))
Если компилятор действительно может оптимизировать второй случай, есть ограничивает сложности функции?
То, что я хочу сделать, это избежать запуска тяжелых функций наверняка математики несколько раз просто ради удобства программирования ...
Благодаря
javap может помочь заглянуть в код байта, созданный компилятором. Я сомневаюсь, что текущий компилятор выполнит оптимизацию, просто потому, что без monads трудно определить, имеет ли код какие-либо побочные эффекты, но я могу ошибаться. –