Jag testade i går kväll att kompilera upp sphlib, det nya bibliotek med hashfunktioner jag bloggade om i går.
På Mac var det inte svårare än att packa upp distributionen och köra det medföljande byggscriptet. Inga varningar eller problem dök upp under bygget och scriptet kör tom ett test av de olika hashfunktionerna efter att de byggts.
Jag upptäckte att det sphlib inkluderade ett benchmark-program, vilket jag naturligtvis kört med följande resultat:
Speed test: MD2
message length = 16 -> 2.32 MBytes/s
message length = 64 -> 4.63 MBytes/s
message length = 256 -> 6.26 MBytes/s
message length = 1024 -> 6.79 MBytes/s
message length = 8192 -> 6.93 MBytes/s
long messages -> 6.92 MBytes/s
Speed test: MD4
message length = 16 -> 75.60 MBytes/s
message length = 64 -> 171.02 MBytes/s
message length = 256 -> 321.05 MBytes/s
message length = 1024 -> 406.36 MBytes/s
message length = 8192 -> 417.39 MBytes/s
long messages -> 425.46 MBytes/s
Speed test: MD5
message length = 16 -> 56.83 MBytes/s
message length = 64 -> 124.44 MBytes/s
message length = 256 -> 221.65 MBytes/s
message length = 1024 -> 271.13 MBytes/s
message length = 8192 -> 290.17 MBytes/s
long messages -> 294.69 MBytes/s
Speed test: SHA-0
message length = 16 -> 37.82 MBytes/s
message length = 64 -> 80.94 MBytes/s
message length = 256 -> 148.31 MBytes/s
message length = 1024 -> 177.09 MBytes/s
message length = 8192 -> 188.11 MBytes/s
long messages -> 187.60 MBytes/s
Speed test: SHA-1
message length = 16 -> 36.36 MBytes/s
message length = 64 -> 79.28 MBytes/s
message length = 256 -> 135.82 MBytes/s
message length = 1024 -> 163.81 MBytes/s
message length = 8192 -> 177.21 MBytes/s
long messages -> 177.21 MBytes/s
Speed test: SHA-224
message length = 16 -> 20.78 MBytes/s
message length = 64 -> 43.04 MBytes/s
message length = 256 -> 73.02 MBytes/s
message length = 1024 -> 85.98 MBytes/s
message length = 8192 -> 90.83 MBytes/s
long messages -> 91.31 MBytes/s
Speed test: SHA-256
message length = 16 -> 20.43 MBytes/s
message length = 64 -> 42.73 MBytes/s
message length = 256 -> 71.50 MBytes/s
message length = 1024 -> 88.58 MBytes/s
message length = 8192 -> 92.52 MBytes/s
long messages -> 91.48 MBytes/s
Speed test: SHA-384
message length = 16 -> 3.51 MBytes/s
message length = 64 -> 14.18 MBytes/s
message length = 256 -> 19.26 MBytes/s
message length = 1024 -> 25.63 MBytes/s
message length = 8192 -> 28.88 MBytes/s
long messages -> 29.02 MBytes/s
Speed test: SHA-512
message length = 16 -> 3.52 MBytes/s
message length = 64 -> 14.04 MBytes/s
message length = 256 -> 19.16 MBytes/s
message length = 1024 -> 25.92 MBytes/s
message length = 8192 -> 31.41 MBytes/s
long messages -> 30.98 MBytes/s
Speed test: RIPEMD
message length = 16 -> 51.34 MBytes/s
message length = 64 -> 111.15 MBytes/s
message length = 256 -> 195.46 MBytes/s
message length = 1024 -> 235.09 MBytes/s
message length = 8192 -> 250.24 MBytes/s
long messages -> 247.85 MBytes/s
Speed test: RIPEMD-128
message length = 16 -> 41.58 MBytes/s
message length = 64 -> 90.01 MBytes/s
message length = 256 -> 154.04 MBytes/s
message length = 1024 -> 185.11 MBytes/s
message length = 8192 -> 197.71 MBytes/s
long messages -> 194.94 MBytes/s
Speed test: RIPEMD-160
message length = 16 -> 28.73 MBytes/s
message length = 64 -> 59.71 MBytes/s
message length = 256 -> 102.10 MBytes/s
message length = 1024 -> 121.77 MBytes/s
message length = 8192 -> 127.55 MBytes/s
long messages -> 130.20 MBytes/s
Speed test: Tiger
message length = 16 -> 23.31 MBytes/s
message length = 64 -> 47.86 MBytes/s
message length = 256 -> 79.82 MBytes/s
message length = 1024 -> 95.64 MBytes/s
message length = 8192 -> 100.71 MBytes/s
long messages -> 101.67 MBytes/s
Speed test: Tiger2
message length = 16 -> 23.24 MBytes/s
message length = 64 -> 47.90 MBytes/s
message length = 256 -> 80.09 MBytes/s
message length = 1024 -> 95.35 MBytes/s
message length = 8192 -> 100.81 MBytes/s
long messages -> 101.47 MBytes/s
Speed test: PANAMA
message length = 16 -> 4.98 MBytes/s
message length = 64 -> 18.87 MBytes/s
message length = 256 -> 65.16 MBytes/s
message length = 1024 -> 170.89 MBytes/s
message length = 8192 -> 323.63 MBytes/s
long messages -> 370.26 MBytes/s
Speed test: HAVAL[3 passes]
message length = 16 -> 28.10 MBytes/s
message length = 64 -> 110.82 MBytes/s
message length = 256 -> 165.24 MBytes/s
message length = 1024 -> 233.50 MBytes/s
message length = 8192 -> 262.07 MBytes/s
long messages -> 266.82 MBytes/s
Speed test: HAVAL[4 passes]
message length = 16 -> 20.69 MBytes/s
message length = 64 -> 82.65 MBytes/s
message length = 256 -> 119.51 MBytes/s
message length = 1024 -> 163.86 MBytes/s
message length = 8192 -> 183.72 MBytes/s
long messages -> 187.14 MBytes/s
Speed test: HAVAL[5 passes]
message length = 16 -> 16.85 MBytes/s
message length = 64 -> 66.94 MBytes/s
message length = 256 -> 90.74 MBytes/s
message length = 1024 -> 127.20 MBytes/s
message length = 8192 -> 144.84 MBytes/s
long messages -> 148.33 MBytes/s
Speed test: WHIRLPOOL
message length = 16 -> 5.09 MBytes/s
message length = 64 -> 10.32 MBytes/s
message length = 256 -> 16.66 MBytes/s
message length = 1024 -> 19.62 MBytes/s
message length = 8192 -> 20.68 MBytes/s
long messages -> 20.90 MBytes/s
Speed test: SHABAL-224
message length = 16 -> 6.65 MBytes/s
message length = 64 -> 20.41 MBytes/s
message length = 256 -> 50.08 MBytes/s
message length = 1024 -> 78.70 MBytes/s
message length = 8192 -> 93.75 MBytes/s
long messages -> 96.67 MBytes/s
Speed test: SHABAL-256
message length = 16 -> 6.73 MBytes/s
message length = 64 -> 20.27 MBytes/s
message length = 256 -> 50.27 MBytes/s
message length = 1024 -> 78.07 MBytes/s
message length = 8192 -> 93.57 MBytes/s
long messages -> 97.57 MBytes/s
Speed test: SHABAL-384
message length = 16 -> 6.67 MBytes/s
message length = 64 -> 20.38 MBytes/s
message length = 256 -> 50.12 MBytes/s
message length = 1024 -> 78.22 MBytes/s
message length = 8192 -> 93.54 MBytes/s
long messages -> 96.53 MBytes/s
Speed test: SHABAL-512
message length = 16 -> 6.60 MBytes/s
message length = 64 -> 20.36 MBytes/s
message length = 256 -> 50.09 MBytes/s
message length = 1024 -> 78.29 MBytes/s
message length = 8192 -> 92.96 MBytes/s
long messages -> 95.80 MBytes/s
Speed test: RadioGatun[32]
message length = 16 -> 8.17 MBytes/s
message length = 64 -> 28.01 MBytes/s
message length = 256 -> 41.35 MBytes/s
message length = 1024 -> 139.11 MBytes/s
message length = 8192 -> 182.84 MBytes/s
long messages -> 190.25 MBytes/s
Speed test: RadioGatun[64]
message length = 16 -> 2.08 MBytes/s
message length = 64 -> 7.99 MBytes/s
message length = 256 -> 20.33 MBytes/s
message length = 1024 -> 41.67 MBytes/s
message length = 8192 -> 56.12 MBytes/s
long messages -> 58.12 MBytes/s
Tittar man på prestandasiffrorna ser man tydligt varför SHA-2-funktionerna har problem att ersätta SHA-1 i verkliga applikationer. Eftersom det även finns benchmark-funktionalitet i OpenSSL kan det vara intressant att jämföra prestandan i sphlib med OpenSSLs implementation:
js@stajlis>openssl speed sha1
To get the most accurate results, try to run this
program when this computer is idle.
Doing sha1 for 3s on 16 size blocks: 2584309 sha1’s in 2.90s
Doing sha1 for 3s on 64 size blocks: 1855209 sha1’s in 2.87s
Doing sha1 for 3s on 256 size blocks: 1016274 sha1’s in 2.86s
Doing sha1 for 3s on 1024 size blocks: 362232 sha1’s in 2.86s
Doing sha1 for 3s on 8192 size blocks: 51519 sha1’s in 2.83s
OpenSSL 0.9.7l 28 Sep 2006
built on: Sat Jul 12 01:44:36 PDT 2008
options:bn(64,32) md2(int) rc4(ptr,char) des(idx,cisc,16,long) aes(partial) blowfish(ptr)
compiler: cc -arch ppc -arch ppc64 -arch i386 -arch x86_64 -g -Os -pipe -arch ppc -arch ppc64 -arch i386 -arch x86_64 -pipe -DOPENSSL_NO_IDEA -DFAR=
available timing options: TIMEB USE_TOD HZ=100 [sysconf value]
timing function used: getrusage
The ‘numbers’ are in 1000s of bytes per second processed.
type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes
sha1 14251.15k 41376.71k 90860.85k 129683.24k 149025.34k
Räknar jag om till MByte får jag 13 MByte/s för 16 Byte data och 145 MByte för 8192 Byte data, vilket är långsammare än sphlib som ger 36 MByte/s respektive 177 MByte. Men vad det sedan beror på (slump?) vågar jag inte ens gissa på. Det här är inte precis någon väl planerad jämförelse. sphlib verkar iaf inte vara brutalt mycket långsammare än OpenSSL.
Eftersom jag har en Dual Core-processor och OpenSSl stödjer att köra på multipla processorer kan det vara intressant att testa vad det ger:
js@stajlis.springfield.se:/Users/js/tmp/untar/sphlib-1.1/c>openssl speed sha1 -multi 2
Forked child 0
Forked child 1
+DT:sha1:3:16
+DT:sha1:3:16
...
...
Got: +H:16:64:256:1024:8192 from 0
Got: +F:5:sha1:12663250.54:35445082.87:81488482.11:115173498.84:133125038.17 from 0
Got: +H:16:64:256:1024:8192 from 1
Got: +F:5:sha1:12774171.87:38159683.91:83045579.61:118426319.78:135401122.10 from 1
timing function used:
sha1 25437.42k 73604.77k 164534.06k 233599.82k 268526.16k
En ganska rejäl prestandaökning, i stort sett 100%. Testade även att köra med än fler processer och fick inga större förändringar. Det verkar alltså som att OpenSSL verkligen lyckas använda båda kärnorna ordentligt.
(Ok, gissar att jag nu kommer att bli dränkt med kommentarer om var jag gick snett och gjort fel. Kom igen bara!)