Quick bench of MRI Ruby 1.9.3-p392 vs 2.0.0-p0 vs JRuby 1.7.3 for computing 2000000 MD5, SHA-1 & FNV hashes. The goal of this benchmark is mainly to compare the ffi vs c-ext performance.
A MBP with a 3GHz Intel Dual Core i7 and OSX 10.8.2 was used. Rubies managed with rbenv.
- MD5 & SHA-1 are part of the Ruby stdlib.
- native FNV is in pure Ruby.
- ffi FNV is in C and for the exception of the first unwarmed JRuby test, all are using :buffer_in in place of :string & :save_errno => false
- c-ext FNV is in C and only run in MRI
- the JRuby warming process is done on every hash test by running it once and then benchmarking the second.
benchmarking for 2000000 iterations
user system total real
MD5: 1.790000 0.040000 1.830000 ( 1.367000)
SHA-1: 1.820000 0.020000 1.840000 ( 1.525000)
native FNV A 32: 15.560000 0.050000 15.610000 ( 14.914000)
native FNV A 64: 21.320000 0.060000 21.380000 ( 20.931000)
native FNV B 32: 5.530000 0.020000 5.550000 ( 5.323000)
native FNV B 64: 20.000000 0.060000 20.060000 ( 19.505000)
ffi FNV 32: 0.830000 0.040000 0.870000 ( 0.686000)
ffi FNV 64: 0.850000 0.100000 0.950000 ( 0.672000)
MD5: 1463058 ops/s
SHA-1: 1311475 ops/s
native FNV A 32: 134102 ops/s
native FNV A 64: 95552 ops/s
native FNV B 32: 375728 ops/s
native FNV B 64: 102538 ops/s
ffi FNV 32: 2915451 ops/s
ffi FNV 64: 2976190 ops/s
benchmarking for 2000000 iterations
user system total real
MD5: 0.960000 0.000000 0.960000 ( 0.939000)
SHA-1: 1.350000 0.010000 1.360000 ( 1.344000)
native FNV A 32: 14.840000 0.050000 14.890000 ( 14.580000)
native FNV A 64: 21.380000 0.060000 21.440000 ( 21.074000)
native FNV B 32: 5.180000 0.010000 5.190000 ( 5.127000)
native FNV B 64: 20.020000 0.060000 20.080000 ( 19.723000)
ffi FNV 32: 0.690000 0.090000 0.780000 ( 0.560000)
ffi FNV 64: 0.560000 0.070000 0.630000 ( 0.570000)
MD5: 2129925 ops/s
SHA-1: 1488095 ops/s
native FNV A 32: 137174 ops/s
native FNV A 64: 94904 ops/s
native FNV B 32: 390092 ops/s
native FNV B 64: 101404 ops/s
ffi FNV 32: 3571429 ops/s
ffi FNV 64: 3508772 ops/s
benchmarking for 2000000 iterations
user system total real
MD5: 0.980000 0.000000 0.980000 ( 0.957000)
SHA-1: 1.440000 0.000000 1.440000 ( 1.435000)
native FNV A 32: 14.570000 0.040000 14.610000 ( 14.342000)
native FNV A 64: 21.710000 0.060000 21.770000 ( 21.420000)
native FNV B 32: 5.210000 0.020000 5.230000 ( 5.159000)
native FNV B 64: 19.800000 0.060000 19.860000 ( 19.536000)
ffi FNV 32: 0.580000 0.010000 0.590000 ( 0.557000)
ffi FNV 64: 0.480000 0.000000 0.480000 ( 0.478000)
MD5: 2089865 ops/s
SHA-1: 1393728 ops/s
native FNV A 32: 139451 ops/s
native FNV A 64: 93371 ops/s
native FNV B 32: 387672 ops/s
native FNV B 64: 102375 ops/s
ffi FNV 32: 3590663 ops/s
ffi FNV 64: 4184099 ops/s
benchmarking for 2000000 iterations
user system total real
MD5: 2.420000 0.000000 2.420000 ( 2.426607)
SHA-1: 2.470000 0.010000 2.480000 ( 2.464689)
native FNV A 32: 42.540000 0.190000 42.730000 ( 42.732171)
native FNV A 64: 50.590000 0.510000 51.100000 ( 51.096869)
native FNV B 32: 8.600000 0.010000 8.610000 ( 8.601596)
native FNV B 64: 44.700000 0.050000 44.750000 ( 44.743619)
ffi FNV 32: 1.120000 0.000000 1.120000 ( 1.119096)
ffi FNV 64: 1.300000 0.000000 1.300000 ( 1.304886)
c-ext FNV 32: 0.400000 0.000000 0.400000 ( 0.393608)
c-ext FNV 64: 0.530000 0.000000 0.530000 ( 0.535392)
MD5: 824196 ops/s
SHA-1: 811461 ops/s
native FNV A 32: 46803 ops/s
native FNV A 64: 39141 ops/s
native FNV B 32: 232515 ops/s
native FNV B 64: 44699 ops/s
ffi FNV 32: 1787157 ops/s
ffi FNV 64: 1532701 ops/s
c-ext FNV 32: 5081199 ops/s
c-ext FNV 64: 3735580 ops/s
benchmarking for 2000000 iterations
user system total real
MD5: 2.990000 0.000000 2.990000 ( 3.000908)
SHA-1: 2.970000 0.010000 2.980000 ( 2.964288)
native FNV A 32: 57.650000 0.060000 57.710000 ( 57.705812)
native FNV A 64: 64.750000 0.140000 64.890000 ( 64.889171)
native FNV B 32: 7.140000 0.000000 7.140000 ( 7.135712)
native FNV B 64: 74.560000 0.090000 74.650000 ( 74.646324)
ffi FNV 32: 1.080000 0.010000 1.090000 ( 1.075347)
ffi FNV 64: 1.380000 0.000000 1.380000 ( 1.382654)
c-ext FNV 32: 0.560000 0.000000 0.560000 ( 0.566394)
c-ext FNV 64: 0.910000 0.000000 0.910000 ( 0.904404)
MD5: 666465 ops/s
SHA-1: 674698 ops/s
native FNV A 32: 34659 ops/s
native FNV A 64: 30822 ops/s
native FNV B 32: 280280 ops/s
native FNV B 64: 26793 ops/s
ffi FNV 32: 1859865 ops/s
ffi FNV 64: 1446493 ops/s
c-ext FNV 32: 3531111 ops/s
c-ext FNV 64: 2211401 ops/s