Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 如何加快公共Lisp`IF`语句的编译速度?_Performance_If Statement_Common Lisp_Runtime Compilation_Clozure Cl - Fatal编程技术网

Performance 如何加快公共Lisp`IF`语句的编译速度?

Performance 如何加快公共Lisp`IF`语句的编译速度?,performance,if-statement,common-lisp,runtime-compilation,clozure-cl,Performance,If Statement,Common Lisp,Runtime Compilation,Clozure Cl,我有一个系统,它可以生成决策树,并将它们转换成嵌套的公共Lispif语句,其中包含检查变量值是否为=或=V1 2)的谓词 (如果(=V2 1)6 0)) (IF(=v22)(IF(您当然可以(声明(优化(编译速度3))),并且可能会降低其他质量(请参阅) 然而,我猜编译速度慢是由编译器进行的优化造成的,因此在执行时结果可能不会太快。但可能不是,您必须进行实验 我也会考虑使用您的领域知识可以进行哪些优化。分析生成的函数的反汇编输出也可能会提供一些提示 最后,如果不同值的数量不太大,也许您可以将决策

我有一个系统,它可以生成决策树,并将它们转换成嵌套的公共Lisp
if
语句,其中包含检查变量值是否为
=
=V1 2)的谓词
(如果(=V2 1)6 0))
(IF(=v22)(IF(您当然可以
(声明(优化(编译速度3)))
,并且可能会降低其他质量(请参阅)

然而,我猜编译速度慢是由编译器进行的优化造成的,因此在执行时结果可能不会太快。但可能不是,您必须进行实验

我也会考虑使用您的领域知识可以进行哪些优化。分析生成的函数的
反汇编
输出也可能会提供一些提示


最后,如果不同值的数量不太大,也许您可以将决策树转换为查找表。

编译函数的实际可移植函数称为
compile

您可以通过低
优化
速度
空间
调试
编译速度
的质量,告诉通用Lisp编译器投入更少的工作-这是否有任何影响取决于实现

Clozure CL编译器通常不是最聪明的编译器,但速度相对较快。一般来说,我认为编译器维护人员可能会给您提供更多关于如何加速编译的提示。一般来说,我会寻找三个

  • 告诉编译器少做一些工作:不进行类型推断、不进行代码优化、不生成调试信息、不节省空间
  • 如果有必要告诉编译器它必须推断的东西,比如说,而不是编译器的类型推断,那么在代码生成过程中声明所有类型。但这意味着您实际上需要从类型声明中获得一些优势,比如提高运行时安全性或代码优化
  • 编译器本身可能会有速度损失,这可能取决于源代码的大小。例如,如果是二次的,那么如果我们将代码大小增加一倍,编译时间将增加四倍。只有编译器维护人员可能知道在这些情况下该怎么做-也许他们需要实现更高效的数据结构或类似的 下一个选项是使用Lisp解释器。它们通常很少有定义时间开销,但代码通常在运行时运行得慢得多。在某些问题域中,可能采用混合方法:编译不经常更改的代码和解释经常更改的代码

    (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)))