[Fluxus] vector operations performance

gabor papp gabor.lists at mndl.hu
Sun May 17 20:10:39 PDT 2009


>> As long as it doesn't impact performance, please feel free to improve
i am testing the performance of vector operators and comparing them to
simple macros that can handle every vector sizes. i attached a vadd
test. it turns out that it is even a bit faster than the c++ version,
probably due to the scheme->c conversion overhead.

adding 2 random vectors:
vadd: 0.00564 0.00783 0.0007
vaddx: 0.00401 0.00724 0.00056

adding 3 random vectors:
vadd: 0.00608 0.01074 0.00064
vaddx: 0.00489 0.00951 0.00108

the results are calculated by adding the vectors 100000 times and
calculating the average time needed to execute the instructions. vadd is
the current vector addition fluxus uses, vaddx is the macro attached.
the three numbers are: the number of milliseconds of CPU time required
to obtain this result, the number of "real" milliseconds required for
the result, and the number of milliseconds of CPU time spent on garbage
collection.

what do you think? can we change the vector operations to more flexible
scheme versions or am i overlooking something?

best,
gabor


----------------------------

(define (vadd2 a b)
  (build-vector (vector-length a)
                (lambda (i)
                  (+ (vector-ref a i)
                     (vector-ref b i)))))

(define-syntax vaddx
  (syntax-rules ()
    [(vaddx a b) (vadd2 a b)]
    [(vaddx a b c ...) (vadd2 a (vaddx b c ...))]))

(define (profile f n)
  (let ([timing-info
          (map (lambda (x)
                  (exact->inexact (/ x n)))
               (foldl (lambda (vl al)
                    (map + vl al))
                    (list 0 0 0)
                    (for/list ([i (in-range n)])
                        (let-values ([(v cpu user gc) (time-apply f '())])
                            (list cpu user gc)))))])
    (printf "~a ~a ~a~n" (list-ref timing-info 0)
                         (list-ref timing-info 1)
                         (list-ref timing-info 2))))

(display "vadd: ")
(profile (lambda () (vadd (rndvec) (rndvec))) 100000)

(display "vaddx: ")
(profile (lambda () (vaddx (rndvec) (rndvec))) 100000)



More information about the Fluxus mailing list