Skip to content

Instantly share code, notes, and snippets.

@colinsurprenant
Last active December 14, 2015 06:19
Show Gist options
  • Save colinsurprenant/5041962 to your computer and use it in GitHub Desktop.
Save colinsurprenant/5041962 to your computer and use it in GitHub Desktop.

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.

JRuby 1.7.3 NOT WARMED

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

JRuby 1.7.3 WARMED

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

JRuby 1.7.3 WARMED with FFI :buffer_in in place of :string & :save_errno => false

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

MRI Ruby 1.9.3-p392

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

MRI Ruby 2.0.0-p0

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment