しょぼしょぼすくりぷと xyzzy編 > lisp programing > xyzzyでの lisp速度考 実験室

xyzzyでの lisp速度考 実験室

気になる、コーディング手法でどのように速度に差が出るか試してみました。 が、もしかしたら意味無いかもしれません。

文字列の比較

;文字列の比較
(let ((st (get-internal-real-time)))

 (dotimes (i 10000)
   ;(string= "equal" "equal")
   ;(equal "equal" "equal")
   ;(string-equal "equal" "equal")
   (string-match "equal" "equal")
   )

 (- (get-internal-real-time) st)
  )

;string= 348
;equal  321 -375
;string-equal 342-411
;string-match 603-701


数値の比較

(let ((st (get-internal-real-time)))

 (dotimes (i 10000)
  (equal 10 12)
   )

 (- (get-internal-real-time) st)
  )

;eq 312 367
;= 309 371
;equal 311 390
数字の比較はやっぱり =で

条件分岐文の比較

(let ((st (get-internal-real-time)))

 (dotimes (i 10000)
  (when (not nil) t)
   )

 (- (get-internal-real-time) st)
  )

;if 309 368
;when 516 588
;unless 608 619
;when not 548 605
;  (if (not nil) (progn t))   318 350
;  (if (not nil) (progn t)(progn nil)) 334 388
予想以上に ifが速く unlessが遅い。 実行するものが一つの場合ifが要?

文字列出力の比較

(let ((st (get-internal-real-time)) (a ""))

 (dotimes (i 10000)
  (format nil "~A~A" a "abc")
   )

 (- (get-internal-real-time) st)
  )

;concat 1202 1220
;concatenate 1074 1145
;  (format nil "~A~A" a "abc")  587 641
format が予想に反して速すぎる。

ブロック実行の比較

(let ((st (get-internal-real-time)) (a ""))

 (dotimes (i 10000)
  (let nil t t)
   )

 (- (get-internal-real-time) st)
  )
;progn 296-359
;prog1 644-667
;prog2 835 887
;prog 920 935
;let 321 380
変数使うなら letは速いかも

変数設定の比較

  (let ((st (get-internal-real-time)) (a ""))

 (dotimes (i 10000)
  (setq j 20
        k 20
        l 10)
   )

 (- (get-internal-real-time) st)
  )

  ; 881 871 861 
  (setq j 20
        k 20
        l 10)

  ; 881 881 891 
  (setq j 20)
  (setq k 20)
  (setq l 10)

びみょー

インクリメンタルの比較

(let ((st (get-internal-real-time))(k 0))

 (dotimes (i 10000)
;  (setq k (+ k 1))
  (incf k)
   )

 (- (get-internal-real-time) st)
  )

;(setq k (+ k 1))
461 490 481

;(setq k (+ 1 k))
461 490

;(setq k (1+ k))
481 461

;(incf k)
5017 4907
incf 遅すぎ


コンパイルすると差はだいぶ無くなるらしい。 実験自体ちょっと弱かったみたい。すいません。。


しょぼしょぼすくりぷと xyzzy編 | lisp programing