I was writing a program, and as I usually do I just immediately
started writing classes for the data structures. However I would like
this algorithm to be fairly efficient so I started wondering about the
efficiency of slot access. Strange that I never though of doing this
before.
here are the results :
using slot accessors
;; Time: 7400.00ms
;; GC time: 1383.33ms
;; Cells: 1150250
using slot-ref
;; Time: 5016.67ms
;; GC time: 166.67ms
;; Cells: 150119
using vectors
;; Time: 1533.33ms
;; GC time: 183.33ms
;; Cells: 150118
using lists
;; Time: 1433.33ms
;; GC time: 183.33ms
;; Cells: 150119
Code is at the end of the e-mail. So a few things I was wondering
about :
Class accessors are 5x slower than vector accesses ? Is this dynamic
binding which is causing the problem, i.e. there is no guarantee that
there is only one min-x method so there is a lot of overhead in the
method look-up, or is it something else ? I thought that slot
accesses would be memoized in some way and so wouldn't suffer too
badly.
list-ref for n <= 4 is slightly FASTER than vector access ?
Is my benchmark valid or is it misguided in some way. Looks like if
you really need speed, better not use a class. True ?
Anyway, I was surprised, so I'm just wondering about how the
implementation impacts the performance.
Brian
------------------------------------------------------------
;; benchmark to test the speed of accessing vector vs the speed of
;; accessing slots.
(define-class <square> ()
(
;; cordinates of upper right corner
(min-x :accessor min-x
:init-keyword :min-x)
(min-y :accessor min-y
:init-keyword :min-y)
(max-x :accessor max-x
:init-keyword :max-x)
(max-y :accessor max-y
:init-keyword :max-y)))
(define square (make <square> :min-x 1 :max-x 5 :min-y 3 :max-y 4))
(define x (vector 1 4 2 10))
(define y '(1 4 2 10))
(define *n* 50000)
(time
(do ((i 0 (+ i 1)))
((> i *n*))
(+ (min-x square) (max-x square) (max-y square) (min-y square))))
(time
(do ((i 0 (+ i 1)))
((> i *n*))
(+ (slot-ref square 'min-x)
(slot-ref square 'max-x)
(slot-ref square 'min-y)
(slot-ref square 'max-y) )))
(time
(do ((i 0 (+ i 1)))
((> i *n*))
(+ (vector-ref x 0) (vector-ref x 1) (vector-ref x 2) (vector-ref x 3))))
(time
(do ((i 0 (+ i 1)))
((> i *n*))
(+ (list-ref y 0) (list-ref y 1) (list-ref y 2) (list-ref y 3))))
Received on Thu Mar 18 1999 - 21:27:52 CET
This archive was generated by hypermail 2.3.0
: Mon Jul 21 2014 - 19:38:59 CEST