{"id":13484291,"url":"https://github.com/SamSaffron/fast_blank","last_synced_at":"2025-03-27T16:30:35.695Z","repository":{"id":7724513,"uuid":"9090526","full_name":"SamSaffron/fast_blank","owner":"SamSaffron","description":null,"archived":false,"fork":false,"pushed_at":"2024-02-21T11:34:57.000Z","size":62,"stargazers_count":617,"open_issues_count":3,"forks_count":35,"subscribers_count":11,"default_branch":"master","last_synced_at":"2025-03-21T12:03:28.274Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/SamSaffron.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"MIT-LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2013-03-29T02:04:19.000Z","updated_at":"2025-03-05T16:57:44.000Z","dependencies_parsed_at":"2024-05-01T10:35:36.533Z","dependency_job_id":"af573fba-4395-422a-a476-317c84022fed","html_url":"https://github.com/SamSaffron/fast_blank","commit_stats":{"total_commits":62,"total_committers":14,"mean_commits":4.428571428571429,"dds":0.532258064516129,"last_synced_commit":"d1695581e397b0b00fb589edae0dec99ce846e42"},"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamSaffron%2Ffast_blank","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamSaffron%2Ffast_blank/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamSaffron%2Ffast_blank/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/SamSaffron%2Ffast_blank/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/SamSaffron","download_url":"https://codeload.github.com/SamSaffron/fast_blank/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245868267,"owners_count":20685607,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T17:01:21.982Z","updated_at":"2025-03-27T16:30:35.667Z","avatar_url":"https://github.com/SamSaffron.png","language":"Ruby","readme":"### `String#blank?` Ruby Extension\n\n[![Gem Version](https://badge.fury.io/rb/fast_blank.svg)](http://badge.fury.io/rb/fast_blank) [![Build Status](https://github.com/SamSaffron/fast_blank/actions/workflows/test.yml/badge.svg?branch=master)](https://github.com/SamSaffron/fast_blank/actions/workflows/test.yml)\n\n`fast_blank` is a simple C extension which provides a fast implementation of [Active Support's `String#blank?` method](http://api.rubyonrails.org/classes/String.html#method-i-blank-3F).\n\n### How do you use it?\n\n    require 'fast_blank'\n\nor add it to your Bundler Gemfile\n\n    gem 'fast_blank'\n\n### How fast is \"Fast\"?\n\nAbout 1.2–20x faster than Active Support on my machine (your mileage my vary, depends on string length):\n\n```\n$ bundle exec ./benchmark\n\n================== Test String Length: 0 ==================\nCalculating -------------------------------------\n          Fast Blank   225.251k i/100ms\n  Fast ActiveSupport   225.676k i/100ms\n          Slow Blank   110.934k i/100ms\n      New Slow Blank   221.792k i/100ms\n-------------------------------------------------\n          Fast Blank     29.673M (± 2.7%) i/s -    148.215M\n  Fast ActiveSupport     28.249M (± 3.5%) i/s -    141.048M\n          Slow Blank      2.158M (± 3.3%) i/s -     10.872M\n      New Slow Blank     23.558M (± 3.2%) i/s -    117.772M\n\nComparison:\n          Fast Blank: 29673200.1 i/s\n  Fast ActiveSupport: 28248894.5 i/s - 1.05x slower\n      New Slow Blank: 23557900.0 i/s - 1.26x slower\n          Slow Blank:  2157787.7 i/s - 13.75x slower\n\n\n================== Test String Length: 6 ==================\nCalculating -------------------------------------\n          Fast Blank   201.185k i/100ms\n  Fast ActiveSupport   205.076k i/100ms\n          Slow Blank   102.061k i/100ms\n      New Slow Blank   123.087k i/100ms\n-------------------------------------------------\n          Fast Blank     13.894M (± 2.3%) i/s -     69.409M\n  Fast ActiveSupport     14.627M (± 3.5%) i/s -     73.212M\n          Slow Blank      1.943M (± 2.3%) i/s -      9.798M\n      New Slow Blank      2.796M (± 1.8%) i/s -     14.032M\n\nComparison:\n  Fast ActiveSupport: 14627063.7 i/s\n          Fast Blank: 13893631.2 i/s - 1.05x slower\n      New Slow Blank:  2795783.3 i/s - 5.23x slower\n          Slow Blank:  1943025.9 i/s - 7.53x slower\n\n\n================== Test String Length: 14 ==================\nCalculating -------------------------------------\n          Fast Blank   220.004k i/100ms\n  Fast ActiveSupport   219.716k i/100ms\n          Slow Blank   147.399k i/100ms\n      New Slow Blank   106.651k i/100ms\n-------------------------------------------------\n          Fast Blank     24.949M (± 3.0%) i/s -    124.742M\n  Fast ActiveSupport     24.491M (± 3.3%) i/s -    122.382M\n          Slow Blank      4.292M (± 1.6%) i/s -     21.520M\n      New Slow Blank      2.115M (± 2.4%) i/s -     10.665M\n\nComparison:\n          Fast Blank: 24948558.8 i/s\n  Fast ActiveSupport: 24491245.1 i/s - 1.02x slower\n          Slow Blank:  4292490.5 i/s - 5.81x slower\n      New Slow Blank:  2115097.6 i/s - 11.80x slower\n\n\n================== Test String Length: 24 ==================\nCalculating -------------------------------------\n          Fast Blank   206.555k i/100ms\n  Fast ActiveSupport   208.513k i/100ms\n          Slow Blank   137.733k i/100ms\n      New Slow Blank   101.215k i/100ms\n-------------------------------------------------\n          Fast Blank     16.761M (± 2.7%) i/s -     83.861M\n  Fast ActiveSupport     17.710M (± 3.2%) i/s -     88.618M\n          Slow Blank      3.744M (± 2.0%) i/s -     18.732M\n      New Slow Blank      1.962M (± 2.7%) i/s -      9.818M\n\nComparison:\n  Fast ActiveSupport: 17709936.5 i/s\n          Fast Blank: 16760839.7 i/s - 1.06x slower\n          Slow Blank:  3744048.4 i/s - 4.73x slower\n      New Slow Blank:  1961831.1 i/s - 9.03x slower\n\n\n================== Test String Length: 136 ==================\nCalculating -------------------------------------\n          Fast Blank   201.772k i/100ms\n  Fast ActiveSupport   189.120k i/100ms\n          Slow Blank   129.439k i/100ms\n      New Slow Blank    90.677k i/100ms\n-------------------------------------------------\n          Fast Blank     16.718M (± 2.8%) i/s -     83.534M\n  Fast ActiveSupport     17.617M (± 3.6%) i/s -     87.941M\n          Slow Blank      3.725M (± 3.0%) i/s -     18.639M\n      New Slow Blank      1.940M (± 4.8%) i/s -      9.702M\n\nComparison:\n  Fast ActiveSupport: 17616782.1 i/s\n          Fast Blank: 16718307.8 i/s - 1.05x slower\n          Slow Blank:  3725097.6 i/s - 4.73x slower\n      New Slow Blank:  1940271.2 i/s - 9.08x slower\n\n\n```\n\nAdditionally, this gem allocates no strings during the test, making it less of a GC burden.\n\n### Compatibility note:\n\n`fast_blank` supports MRI Ruby 1.9.3, 2.0, 2.1, and 2.2, as well as Rubinius 2.x. Earlier versions of MRI are untested.\n\n`fast_blank` implements `String#blank?` as MRI would have implemented it, meaning it has 100% parity with `String#strip.length == 0`.\n\nActive Support's version also considers Unicode spaces.  For example, `\"\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\".blank?` is true in Active Support even though `fast_blank` would treat it as *not* blank.  Therefore, `fast_blank` also provides `blank_as?` which is a 100%-compatible Active Support `blank?` replacement.\n\n### Credits\n\n* Author: Sam Saffron (sam.saffron@gmail.com)\n* https://github.com/SamSaffron/fast_blank\n* License: MIT\n* Gem template based on [CodeMonkeySteve/fast_xor](https://github.com/CodeMonkeySteve/fast_xor)\n\n### Change log:\n\n1.0.1:\n  - Minor, avoid warnings if redefining blank?\n\n1.0.0:\n  - Adds Ruby 2.2 support ([@tjschuck](https://github.com/tjschuck) — [#9](https://github.com/SamSaffron/fast_blank/pull/9))\n\n0.0.2:\n  - Removed rake dependency ([@tmm1](https://github.com/tmm1) — [#2](https://github.com/SamSaffron/fast_blank/pull/2))\n  - Unrolled internal loop to improve perf ([@tmm1](https://github.com/tmm1) — [#2](https://github.com/SamSaffron/fast_blank/pull/2))\n","funding_links":[],"categories":["Ruby","Optimizations","High Performance Libraries"],"sub_categories":["Application Insights"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSamSaffron%2Ffast_blank","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FSamSaffron%2Ffast_blank","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FSamSaffron%2Ffast_blank/lists"}