Simplify NIF loading (#24) Let's make it like other nifs do. Thanks Nick for the hints!
This is an Erlang NIF for Google's snappy fast compressor and decompressor.
Google snappy's official repository and bug tracking system is at:
Its source is included in this project.
https://github.com/fdmanana/snappy-erlang-nif
Snappy is much faster than zlib's deflate compression, specially for reasonably large amounts of data. Here follow a few basic tests.
Erlang/OTP 26 [erts-14.2.5.10] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] Eshell V14.2.5.10 (press Ctrl+G to abort, type help(). for help) 1> code:add_path("ebin"). true 2> {ok, J} = file:read_file("doc_11k.json"). {ok,<<"{\n \"data3\": \"vh3w3TyPAxe01SOJhOgTMzOI8vO6tUZv0h36XVdRvECcDBJW5VAeLOJC1u9NRumMg5BcDp932M41Plr1Rg0sekoUawsGZL"...>>} 3> timer:tc(snappy, compress, [J]). {251616, {ok,<<"øUô÷*{\n \"data3\": \"vh3w3TyPAxe01SOJhOgTMzOI8vO6tUZv0h36XVdRvECcDBJW5VAeLOJC1u9NRumMg5BcDp932M41Plr1R"...>>}} 4> timer:tc(snappy, compress, [J]). {59, {ok,<<"øUô÷*{\n \"data3\": \"vh3w3TyPAxe01SOJhOgTMzOI8vO6tUZv0h36XVdRvECcDBJW5VAeLOJC1u9NRumMg5BcDp932M41Plr1R"...>>}} 5> timer:tc(snappy, compress, [J]). {36, {ok,<<"øUô÷*{\n \"data3\": \"vh3w3TyPAxe01SOJhOgTMzOI8vO6tUZv0h36XVdRvECcDBJW5VAeLOJC1u9NRumMg5BcDp932M41Plr1R"...>>}} 6> timer:tc(snappy, compress, [J]). {57, {ok,<<"øUô÷*{\n \"data3\": \"vh3w3TyPAxe01SOJhOgTMzOI8vO6tUZv0h36XVdRvECcDBJW5VAeLOJC1u9NRumMg5BcDp932M41Plr1R"...>>}} 7> timer:tc(snappy, compress, [J]). {34, {ok,<<"øUô÷*{\n \"data3\": \"vh3w3TyPAxe01SOJhOgTMzOI8vO6tUZv0h36XVdRvECcDBJW5VAeLOJC1u9NRumMg5BcDp932M41Plr1R"...>>}} 8> timer:tc(snappy, compress, [J]). {53, {ok,<<"øUô÷*{\n \"data3\": \"vh3w3TyPAxe01SOJhOgTMzOI8vO6tUZv0h36XVdRvECcDBJW5VAeLOJC1u9NRumMg5BcDp932M41Plr1R"...>>}} 9> timer:tc(zlib, zip, [J]). {461, <<21,154,71,14,165,74,18,69,231,127,21,95,181,2,188,233, 25,222,123,207,12,239,125,98,91,189,247,...>>} 10> timer:tc(zlib, zip, [J]). {431, <<21,154,71,14,165,74,18,69,231,127,21,95,181,2,188,233, 25,222,123,207,12,239,125,98,91,189,247,...>>} 11> timer:tc(zlib, zip, [J]). {440, <<21,154,71,14,165,74,18,69,231,127,21,95,181,2,188,233, 25,222,123,207,12,239,125,98,91,189,247,...>>} 12> timer:tc(zlib, zip, [J]). {332, <<21,154,71,14,165,74,18,69,231,127,21,95,181,2,188,233, 25,222,123,207,12,239,125,98,91,189,247,...>>} 13> timer:tc(zlib, zip, [J]). {303, <<21,154,71,14,165,74,18,69,231,127,21,95,181,2,188,233, 25,222,123,207,12,239,125,98,91,189,247,...>>} 14> timer:tc(zlib, zip, [J]). {406, <<21,154,71,14,165,74,18,69,231,127,21,95,181,2,188,233, 25,222,123,207,12,239,125,98,91,189,247,...>>} 15> byte_size(element(2, snappy:compress(J))). 11005 16> byte_size(zlib:zip(J)). 8284
17> crypto:start(). ok 18> Large = base64:encode(crypto:strong_rand_bytes(100 * 1024)). <<"E8CcPijHF6N2/WMTvRkLr7FdkCWlndHx8iVh3n7ZPHD3khPnzPefazjDk7Ox2B1zIxA2TVB+4RDBSk2DmDXQM4sasup06Y2uZrsWgnUF9DBTkJVxuB3L"...>> 19> timer:tc(snappy, compress, [Large]). {201, {ok,<<"ت\bôÿÿE8CcPijHF6N2/WMTvRkLr7FdkCWlndHx8iVh3n7ZPHD3khPnzPefazjDk7Ox2B1zIxA2TVB+4RDBSk2DmDXQM4sasup06Y"...>>}} 20> timer:tc(snappy, compress, [Large]). {204, {ok,<<"ت\bôÿÿE8CcPijHF6N2/WMTvRkLr7FdkCWlndHx8iVh3n7ZPHD3khPnzPefazjDk7Ox2B1zIxA2TVB+4RDBSk2DmDXQM4sasup06Y"...>>}} 21> timer:tc(snappy, compress, [Large]). {179, {ok,<<"ت\bôÿÿE8CcPijHF6N2/WMTvRkLr7FdkCWlndHx8iVh3n7ZPHD3khPnzPefazjDk7Ox2B1zIxA2TVB+4RDBSk2DmDXQM4sasup06Y"...>>}} 22> timer:tc(snappy, compress, [Large]). {312, {ok,<<"ت\bôÿÿE8CcPijHF6N2/WMTvRkLr7FdkCWlndHx8iVh3n7ZPHD3khPnzPefazjDk7Ox2B1zIxA2TVB+4RDBSk2DmDXQM4sasup06Y"...>>}} 23> timer:tc(zlib, zip, [Large]). {7116, <<20,155,197,114,227,64,20,69,63,72,11,49,45,197,44,89, 12,59,49,51,235,235,39,179,74,57,113,...>>} 24> timer:tc(zlib, zip, [Large]). {7254, <<20,155,197,114,227,64,20,69,63,72,11,49,45,197,44,89, 12,59,49,51,235,235,39,179,74,57,113,...>>} 25> timer:tc(zlib, zip, [Large]). {7136, <<20,155,197,114,227,64,20,69,63,72,11,49,45,197,44,89, 12,59,49,51,235,235,39,179,74,57,113,...>>} 26> timer:tc(zlib, zip, [Large]). {6760, <<20,155,197,114,227,64,20,69,63,72,11,49,45,197,44,89, 12,59,49,51,235,235,39,179,74,57,113,...>>} 27> timer:tc(zlib, zip, [Large]). {7349, <<20,155,197,114,227,64,20,69,63,72,11,49,45,197,44,89, 12,59,49,51,235,235,39,179,74,57,113,...>>} 28> byte_size(element(2, snappy:compress(Large))). 136548 29> byte_size(zlib:zip(Large)). 103438