The previous topic I mentioned SBCL implementation of bytevector->integer and it said Sagittarius was faster then SBCL. And I thought it was because of the machine spec that I took the improvement benchmark. So now, my question is 'Is Sagittarius really faster than SBCL?'
Conclusion first, SBCL was faster. Then how much faster is it?
The benchmark result is this.
~/projects/build$ sbcl --script test.lisp Evaluation took: 0.036 seconds of real time 0.036003 seconds of total run time (0.032002 user, 0.004001 system) 100.00% CPU 105,786,338 processor cycles 5,600,520 bytes consed ~/projects/build$ sash test.scm ;; 0.075894 real 0.072005 user 0.004000 sysThe used code is the same as my bytevector->integer topic and the one on gist. (So it was actually not the same data and might be a bit advantaged for SBCL. Because compiler can optimise the embedded array.)
OK, here comes my excuse. The CL one is not actually for bytevector but for u64 vector. The author told me, vector access for word size is faster than octet size, so u64 size is the fastest code and other must have one or more loops to construct bignum. And he also told me, if he add one more loop, it became 10 times slower (I tried but my CL skill was not good enough to implement it).
On the other hand, Sagittarius does construct bignum from bytevector so that it has nested loops inside. If the author was correct, then Sagittarius is faster than SBCL. Well, I know this is just dreaming...
I tested with my own implementation of bytevector->integer on SBCL and Sagittarius was actually 10 times faster. For more details, see this page (in Japanese)
No comments:
Post a Comment