You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Luckily for us the eps= is still under-optimized (why are we using LESSP even when both arguments have been declared as float?), so we can implement a solution that has both better performance and is type-safe.
(defunfoo ()
(dotimes (i 100000000)
(eps= 1.01.0)))
(defunbar ()
(dotimes (i 100000000)
(my-eps= 1.01.0)))
(defunbar-int ()
(dotimes (i 100000000)
(my-eps= 11.0)))
(defunbar-int-int ()
(dotimes (i 100000000)
(my-eps= 11)))
1.irteusgl$ (my-eps= 11.0)
t
2.irteusgl$ (my-eps= 11.1)
nil
3.irteusgl$ (bench (foo))
;; time -> 2.63216[s]nil
4.irteusgl$ (bench (bar))
;; time -> 2.31267[s]nil
5.irteusgl$ (bench (bar-int))
;; time -> 2.76027[s]nil
6.irteusgl$ (bench (bar-int-int))
;; time -> 3.43548[s]nil
The time for the optimized and unsafe code was (bench (bar)) ;; time -> 1.92481[s].
Compiling with -O3 made it even faster, with 1.93313[s] for the type-check and 1.64588[s] for the unsafe.
となります.これは,
EusLisp/lisp/geo/geopack.l
Lines 197 to 199 in 41c497d
で
(declare (type float m n eps))
のお陰で,通常ならとコンパイルされるところが
となっているからのようです.ちなみにこの効果がどれぐらいあるか,ですが,
https://gist.github.com/k-okada/39732bdcbf44b485378612dbc39ecb9d
を実行してみると1.3-1.8 倍ぐらい速くなっています.
そもそもは型チェックをしない代わりに高速なコードを生成するのが目的なので,
すこし対応としてはずれますが,
エラーチェックをする,あるいは,方をチェックする,という方法ですが,
https://github.com/euslisp/EusLisp/blob/master/lisp/c/eus.h#L818-L822
を使って
とすると,
となり,110-150%程時間が掛かるようです.
ちゃと仕様どおり引数に実数を入れていても110%程になる,ということで,
これをどう見るか?ワーニングを出すものと,型をキャストするコードにはそこまで速度は変わらず,
結局,型をキャストするかどうか?するならワーニングを出すべきか,という判断になりそうです.
The text was updated successfully, but these errors were encountered: