优化Lisp函数调用

时间:2015-11-09 12:08:40

标签: optimization lisp

如果我的代码正在调用一个函数,并且函数的一个参数将根据某个条件而变化,那么将条件语句作为函数的参数更有效,或者在函数中多次调用函数条件陈述。 例如:

(if condition (+ 4 3) (+ 5 3))
(+ (if condition 4 5) 3)

这只是一个例子:在真实场景中,数字将被长而复杂的表达式所取代,这些表达式充满了变量。 if可能是一个长cond语句。

哪个在速度,空间等方面更有效?

2 个答案:

答案 0 :(得分:4)

不要

你关心的不是表现(在这种情况下差别很小)但是代码可读性。

记住,

  

“......计算机语言不仅仅是一种获取计算机的方式   执行操作,而是......它是一种新颖的正式媒介   表达关于方法论的想法“

     

Abelson / Sussman“结构和   解读计算机程序“。

您主要是为其他人(明年你自己!)编写代码来阅读。计算机可以执行它的事实是一个受欢迎的附带好处。 (当然,我夸大其词,但比你想的要少得多)。

好...

现在你跳过了讨论(如果你声称没有,请闭上眼睛告诉我上面提到的哪种语言),让我试着回答你的问题。

如果您对程序进行了分析并发现此位置是瓶颈,则应首先确保使用正确的算法。

例如,使用线性排序(合并/堆)而不是二次(气泡/插入)排序将使 与您正在考虑的微优化相比有更大的差异。

然后你应该反汇编你的两个版本的代码;较短的版本(ceteris paribus)可能稍微快一些。

最后,你可以浪费几个小时的机器时间在另一个闲置的盒子上的同一输出上重复运行两个版本,以发现这两种方法之间没有统计学上的显着差异。

答案 1 :(得分:1)

我同意sds的答案中的所有内容(除了使用技巧问题-_-),但我认为添加一个例子可能会很好。您提供的代码没有足够的上下文透明。为什么5?为什么4?为什么3?什么时候应该使用?应该只有两种选择吗?你现在得到的代码有点像:

return dcFormatter.stringFromTimeInterval(seconds % 86340)!

请记住,如果你需要这些神奇的数字(3和4),你可能需要在其他地方使用它们。如果您必须更改它们,您将不得不希望您不会错过任何案例。这不好玩。相反,你可能会这样做:

(defun compute-cost (fixed-cost transaction-type)
  (+ fixed-cost
     (if (eq transaction-type 'discount) ; hardcoded magic numbers
         3                               ; and conditions are brittle
         4)))

现在有一个额外的函数调用,这是真的,但魔术加数的计算被拉出到它自己的组件中,并且可以被任何需要它的东西重用,并且可以在不改变任何其他代码的情况下进行更新。