Hello,
I was working on a cl-opengl app recently and I noticed that my textures were taking much longer to load than I could remember. After some investigation I could distill the following test functions:
(defun test-1 ()
(let* ((array (make-sequence 'vector (* 512 512 3) :initial-element 0))
(count (length array)))
(cffi:with-foreign-object (data 'cl-opengl-bindings:ubyte count)
(loop for i below count
do
(setf (cffi:mem-aref data 'cl-opengl-bindings:ubyte i) (aref array i))))))
(defun test-2 ()
(let* ((array (make-sequence 'vector (* 512 512 3) :initial-element 0))
(count (length array))
(type (cl-opengl::symbolic-type->real-type :unsigned-byte)))
(cffi:with-foreign-object (data type count)
(loop for i below count
do
(setf (cffi:mem-aref data type i) (aref array i))))))
Now observe the timings (in SBCL) for them:
* (time (test-1))
Evaluation took:
0.027 seconds of real time
0.019999 seconds of user run time
0.006666 seconds of system run time
0 calls to %EVAL
0 page faults and
3,145,736 bytes consed.
NIL
* (time (test-2))
Evaluation took:
9.565 seconds of real time
8.629437 seconds of user run time
0.236652 seconds of system run time
[Run times include 0.74 seconds GC run time.]
0 calls to %EVAL
0 page faults and
688,918,576 bytes consed.
A substantial difference is apparent.
For completeness I also tried CLISP:
[14]> (time (test-1))
Real time: 10.952836 sec.
Run time: 10.169337 sec.
Space: 173015440 Bytes
GC: 100, GC time: 0.816611 sec.
NIL
[15]> (time (test-2))
Real time: 18.55567 sec.
Run time: 17.215544 sec.
Space: 342884976 Bytes
GC: 199, GC time: 1.526577 sec.
NIL
While not as prominent, a difference is still clearly visible. Now I'm curious as to why there's such a performance difference here, am I missing something obvious? Does it happen to anyone else?
Sincerely,
Mikael Lax
PS: I don't know if this or cl-opengl is the appropriate mailing-list for this, but since there seems to be some cross-pollination of cl-opengl/cffi developers I'm sending it here on a gamble.