関数my-length1、実効速度:遅、使用メモリ:小
関数my-length2、実装速度:速、使用メモリ:大
を意図して次の2つの関数を定義しました。

(defun my-length1 (lst)
(labels ((rec (lst acc)
(if (null lst)
acc
(rec (cdr lst) (1+ acc)))))
(rec lst 0)))

(labels ((rec (lst acc)
(if (null lst)
acc
(rec (cdr lst) (1+ acc)))))
(defun my-length2 (lst) (rec lst 0)))

しかし、disassembleしてみると、
両者は同等のアセンブリコードにコンパイルされていました (SBCL)。

上の関数my-length1は呼び出される度に局所関数を生成し、
下の関数my-length2は関数が定義時に局所関数が一度だけ生成される、
と思っていたのですが違いました。

上の意図のような使い分けをするための方法はあるのでしょうか?
情報をいただけるとうれしいです。