これまで、同じ関数を作成するためのさまざまなアプローチの速度をテストしている間、私はそのtime
関数を使用してきました。一般に、さまざまな関数の相対速度をよく示しています(通常、約10万サイクル異なるため)。
factorial
しかし、関数の最速のアプローチを見つけようとしている間、time
欠けていました。これらの方法は、10k〜30kサイクルだけ異なるように見えるだけでなく、全体の時間もその約半分の量だけ異なります(これは予想されることです)。
3つのfactorial
機能:
(defun factorial-recusion (n) ; 1st
(if (equal n 1)
1
(* n (factorial (- n 1)))))
(defun factorial-loop (n) ; 2nd
(let ((solution 1))
(loop for x from n downto 2
do (setf solution (* solution x))
finally (return solution))))
(defun factorial-do (n) ; 3rd
(let ((solution 1))
(do ((x n (1- x)))
((< x 2) (return solution))
(setf solution (* solution x)))))
だから、私は2つの質問があると思います:
1.)どの方法factorial
が最速である必要がありますか(実際にそうである場合)、そしてその理由は何ですか?
2.)一般的な方法でより高速な機能を自分で見つけた場合、それを行うための最良の方法は何ですか(何らかの理由で、LOCは速度の悪い指標だと思います)。おそらく、Lispバイトコードの逆アセンブルを表示する方法はありますか?それとも、もっと良い、もっと厳密な方法があるのでしょうか?
私は現在、Ubuntu 12.04x86-64でLinux3.2.0-26、SBCLを実行しています。