Skip to content

Instantly share code, notes, and snippets.

@robrwo
Created December 28, 2024 13:32
Show Gist options
  • Save robrwo/04d46531eedb43b2f2ab1fd08258ae12 to your computer and use it in GitHub Desktop.
Save robrwo/04d46531eedb43b2f2ab1fd08258ae12 to your computer and use it in GitHub Desktop.
Benchmarking modules for retrieving secure random data
use v5.20;
use warnings;
use experimental qw( signatures );
use Benchmark::Dumb qw( cmpthese );
use Crypt::URandom ();
use Sys::GetRandom ();
use Sys::GetRandom::PP ();
use Sys::GetRandom::FFI ();
sub sys_getrandom_xs($size) {
return sub() { Sys::GetRandom::getrandom( my $data, $size ) }
}
sub sys_getrandom_pp($size) {
return sub() { Sys::GetRandom::PP::getrandom( my $data, $size ) }
}
sub sys_getrandom_ffi($size) {
return sub() { Sys::GetRandom::FFI::getrandom($size) }
}
sub crypt_urandom($size) {
return sub() { Crypt::URandom::urandom($size) }
}
for my $size (qw( 4 16 32 256 1024 )) {
say "\nBenchmarking ${size} bytes\n";
cmpthese(
0.001,
{
'Crypt::URandom' => crypt_urandom($size),
'Sys::GetRandom' => sys_getrandom_xs($size),
'Sys::GetRandom::PP' => sys_getrandom_pp($size),
'Sys::GetRandom::FFI' => sys_getrandom_ffi($size),
}
);
}
@robrwo
Copy link
Author

robrwo commented Dec 28, 2024

Results from running this


Benchmarking 4 bytes

                    Rate/s Precision/s Crypt::URandom Sys::GetRandom::PP Sys::GetRandom::FFI Sys::GetRandom
Crypt::URandom      488420         150             --               0.0%              -13.2%         -43.2%
Sys::GetRandom::PP  488559          71           0.0%                 --              -13.2%         -43.2%
Sys::GetRandom::FFI 562632          90          15.2%              15.2%                  --         -34.6%
Sys::GetRandom      860190         350          76.1%              76.1%               52.9%             --

Benchmarking 16 bytes

                    Rate/s Precision/s Crypt::URandom Sys::GetRandom::PP Sys::GetRandom::FFI Sys::GetRandom
Crypt::URandom      466860         480             --              -2.4%              -14.7%         -47.0%
Sys::GetRandom::PP  478250         110    2.44+-0.11%                 --              -12.6%         -45.7%
Sys::GetRandom::FFI 547390         120   17.25+-0.12%              14.5%                  --         -37.9%
Sys::GetRandom      881410         910   88.79+-0.27%         84.3+-0.2%        61.02+-0.17%             --

Benchmarking 32 bytes

                    Rate/s Precision/s Sys::GetRandom::PP Crypt::URandom Sys::GetRandom::FFI Sys::GetRandom
Sys::GetRandom::PP  464090         440                 --          -0.9%              -12.0%         -46.6%
Crypt::URandom      468510         250        0.95+-0.11%             --              -11.2%         -46.1%
Sys::GetRandom::FFI 527650          81        13.7+-0.11%          12.6%                  --         -39.2%
Sys::GetRandom      868520         140       87.15+-0.18%    85.38+-0.1%               64.6%             --

Benchmarking 256 bytes

                    Rate/s Precision/s Crypt::URandom Sys::GetRandom::PP Sys::GetRandom::FFI Sys::GetRandom
Crypt::URandom      297980         300             --              -8.2%              -15.9%         -36.9%
Sys::GetRandom::PP  324700         120    8.97+-0.12%                 --               -8.4%         -31.2%
Sys::GetRandom::FFI 354368          86   18.92+-0.12%               9.1%                  --         -24.9%
Sys::GetRandom      472140         330   58.45+-0.19%       45.41+-0.12%               33.2%             --

Benchmarking 1024 bytes

                    Rate/s Precision/s Crypt::URandom Sys::GetRandom::PP Sys::GetRandom::FFI Sys::GetRandom
Crypt::URandom      155811          70             --              -3.5%              -11.5%         -20.0%
Sys::GetRandom::PP  161520         110           3.7%                 --               -8.3%         -17.1%
Sys::GetRandom::FFI 176143          39          13.0%               9.1%                  --          -9.6%
Sys::GetRandom      194840          30          25.0%              20.6%               10.6%             --

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment