{"id":15587698,"url":"https://github.com/icyleaf/fast-crystal","last_synced_at":"2026-03-16T21:33:26.935Z","repository":{"id":44392454,"uuid":"90330302","full_name":"icyleaf/fast-crystal","owner":"icyleaf","description":"💨 Writing Fast Crystal 😍 -- Collect Common Crystal idioms. ","archived":false,"fork":false,"pushed_at":"2020-12-31T14:49:34.000Z","size":63,"stargazers_count":167,"open_issues_count":2,"forks_count":8,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-04-13T15:57:02.631Z","etag":null,"topics":["benchmark","crystal"],"latest_commit_sha":null,"homepage":null,"language":"Crystal","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/icyleaf.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-05-05T02:45:45.000Z","updated_at":"2024-11-26T19:23:20.000Z","dependencies_parsed_at":"2022-07-14T20:46:56.946Z","dependency_job_id":null,"html_url":"https://github.com/icyleaf/fast-crystal","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/icyleaf/fast-crystal","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/icyleaf%2Ffast-crystal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/icyleaf%2Ffast-crystal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/icyleaf%2Ffast-crystal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/icyleaf%2Ffast-crystal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/icyleaf","download_url":"https://codeload.github.com/icyleaf/fast-crystal/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/icyleaf%2Ffast-crystal/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265437620,"owners_count":23765124,"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":["benchmark","crystal"],"created_at":"2024-10-02T22:02:55.776Z","updated_at":"2026-03-16T21:33:26.890Z","avatar_url":"https://github.com/icyleaf.png","language":"Crystal","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 💎 Fast Crystal\n\nIt's Crystal version based on [ruby version](https://github.com/JuanitoFatas/fast-ruby).\n\nEach idiom has a corresponding code example that resides in [code](code).\n\nAll results listed in README.md are running with Crystal 0.25.0 (2018-06-15) LLVM 5.0.1 on OS X 10.13.5.\n\nMachine information: MacBook Pro (Retina, 15-inch, Mid 2015), 2.2 GHz Intel Core i7, 16 GB 1600 MHz DDR3.\n\nYour results may vary, but you get the idea. : )\n\n\u003e Doubt the results? please discuss in [Crystal Issue#4383](https://github.com/crystal-lang/crystal/issues/4383).\n\n**Let's write faster code, together! :trollface:**\n\n## Measurement Tool\n\nUse Crystal's built-in [benchmark](https://crystal-lang.org/api/0.22.0/Benchmark.html).\n\n## Run the Benchmarks\n\n```bash\n$ make\n```\n\n### Template\n\n```crystal\nrequire \"benchmark\"\n\ndef fast\nend\n\ndef slow\nend\n\nBenchmark.ips do |x|\n  x.report(\"fast code description\") { fast }\n  x.report(\"slow code description\") { slow }\nend\n```\n\n## Idioms\n\n### Index\n\n- [Array](#array)\n- [Enumerable](#enumerable)\n- [General](#general)\n- [Hash](#hash)\n- [NamedTuple](#namedtuple)\n- [Proc \u0026 Block](#proc--block)\n- [String](#string)\n\n\u003e Test in Crystal 0.35.1 (2020-06-19)  LLVM: 10.0.0 Default target: x86_64-apple-macosx\n\n### Array\n\n#### `first` vs `index[0]` [code](code/array/first-vs-index[0].cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/array/first-vs-index[0] code/array/first-vs-index[0].cr\n$ ./bin/code/array/first-vs-index[0]\n\nArray#first 265.31M (  3.77ns) (±11.17%)  0.0B/op   1.01× slower\n  Array#[0] 267.85M (  3.73ns) (± 6.86%)  0.0B/op        fastest\n```\n\n#### `insert` vs `unshift` [code](code/array/insert-vs-unshift.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/array/insert-vs-unshift code/array/insert-vs-unshift.cr\n$ ./bin/code/array/insert-vs-unshift\n\n Array#insert   1.30  (768.66ms) (± 1.33%)  1.5MB/op        fastest\nArray#unshift   1.29  (775.05ms) (± 1.81%)  1.5MB/op   1.01× slower\n```\n\n#### `last` vs `index[-1]` [code](code/array/last-vs-index[-1].cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/array/last-vs-index[-1] code/array/last-vs-index[-1].cr\n$ ./bin/code/array/last-vs-index[-1]\n\nArray#[-1] 273.97M (  3.65ns) (± 4.16%)  0.0B/op        fastest\nArray#last 273.61M (  3.65ns) (± 4.75%)  0.0B/op   1.00× slower\n```\n\n#### `range` vs `times.map` [code](code/array/range-vs-times.map.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/array/range-vs-times.map code/array/range-vs-times.map.cr\n$ ./bin/code/array/range-vs-times.map\n\nRange#to_a   1.11M (897.91ns) (±17.84%)  1.67kB/op        fastest\nTimes#to_a   1.02M (980.17ns) (±17.56%)  1.69kB/op   1.09× slower\n```\n\n### Enumerable\n\n#### `each push` vs `map` [code](code/enumerable/each-push-vs-map.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/enumerable/each-push-vs-map code/enumerable/each-push-vs-map.cr\n$ ./bin/code/enumerable/each-push-vs-map\n\n             Array#map 507.91k (  1.97µs) (±11.92%)  3.96kB/op        fastest\n     Array#each + push 145.04k (  6.89µs) (±18.89%)  12.7kB/op   3.50× slower\nArray#each_with_object 155.85k (  6.42µs) (±17.07%)  12.7kB/op   3.26× slower\n```\n\n#### `each` vs `loop` [code](code/enumerable/each-vs-loop.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/enumerable/each-vs-loop code/enumerable/each-vs-loop.cr\n$ ./bin/code/enumerable/each-vs-loop\n\nWhile Loop   1.64M (609.64ns) (± 7.66%)  0.0B/op  159.20× slower\n     #each 261.15M (  3.83ns) (±10.82%)  0.0B/op         fastest\n```\n\n#### `each_with_index` vs `while loop` [code](code/enumerable/each_with_index-vs-while-loop.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/enumerable/each_with_index-vs-while-loop code/enumerable/each_with_index-vs-while-loop.cr\n$ ./bin/code/enumerable/each_with_index-vs-while-loop\n\n     While Loop   1.51M (661.13ns) (± 9.29%)  0.0B/op   6.94× slower\neach_with_index  10.50M ( 95.23ns) (±17.95%)  0.0B/op        fastest\n```\n\n#### `map flatten` vs `flat_map` [code](code/enumerable/map-flatten-vs-flat_map.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/enumerable/map-flatten-vs-flat_map code/enumerable/map-flatten-vs-flat_map.cr\n$ ./bin/code/enumerable/map-flatten-vs-flat_map\n\n   Array#flat_map (Tuple) 902.86k (  1.11µs) (± 6.63%)  3.65kB/op        fastest\nArray#map.flatten (Tuple) 664.00k (  1.51µs) (± 6.00%)  4.69kB/op   1.36× slower\n   Array#flat_map (Array) 238.37k (  4.20µs) (± 5.73%)  7.18kB/op   3.79× slower\nArray#map.flatten (Array) 193.64k (  5.16µs) (± 3.78%)  9.39kB/op   4.66× slower\n```\n\n#### `reverse.each` vs `reverse_each` [code](code/enumerable/reverse.each-vs-reverse_each.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/enumerable/reverse.each-vs-reverse_each code/enumerable/reverse.each-vs-reverse_each.cr\n$ ./bin/code/enumerable/reverse.each-vs-reverse_each\n\nArray#reverse.each   4.03M (248.39ns) (± 5.02%)  480B/op   4.94× slower\nArray#reverse_each  19.88M ( 50.30ns) (± 2.49%)  0.0B/op        fastest\n```\n\n#### `sort` vs `sort_by` [code](code/enumerable/sort-vs-sort_by.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/enumerable/sort-vs-sort_by code/enumerable/sort-vs-sort_by.cr\n$ ./bin/code/enumerable/sort-vs-sort_by\n\n   Enumerable#sort 145.32k (  6.88µs) (± 2.89%)  3.07kB/op   1.17× slower\nEnumerable#sort_by 170.71k (  5.86µs) (± 4.47%)  1.04kB/op        fastest\n```\n\n### General\n\n#### Assignment [code](code/general/assignment.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/general/assignment code/general/assignment.cr\n$ ./bin/code/general/assignment\n\nSequential Assignment 611.21M (  1.64ns) (± 4.98%)  0.0B/op   1.00× slower\n  Parallel Assignment 613.61M (  1.63ns) (± 5.04%)  0.0B/op        fastest\n```\n\n#### `hash` vs `struct` vs `namedtuple` [code](code/general/hash-vs-struct-vs-namedtuple.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/general/hash-vs-struct-vs-namedtuple code/general/hash-vs-struct-vs-namedtuple.cr\n$ ./bin/code/general/hash-vs-struct-vs-namedtuple\n\nNamedTuple 515.36M (  1.94ns) (± 4.05%)  0.0B/op        fastest\n    Struct 503.85M (  1.98ns) (± 6.54%)  0.0B/op   1.02× slower\n      Hash   9.60M (104.18ns) (± 2.76%)  208B/op  53.69× slower\n```\n\n#### `loop` vs `while_true` [code](code/general/loop-vs-while_true.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/general/loop-vs-while_true code/general/loop-vs-while_true.cr\n$ ./bin/code/general/loop-vs-while_true\n\n While Loop 512.11M (  1.95ns) (± 5.15%)  0.0B/op        fastest\nKernel Loop 482.98M (  2.07ns) (±16.94%)  0.0B/op   1.06× slower\n```\n\n#### `positional_argument` vs `named_argument` [code](code/general/positional_argument-vs-named_argument.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/general/positional_argument-vs-named_argument code/general/positional_argument-vs-named_argument.cr\n$ ./bin/code/general/positional_argument-vs-named_argument\n\n     Named arguments 564.18M (  1.77ns) (±16.11%)  0.0B/op   1.03× slower\nPositional arguments 578.90M (  1.73ns) (±10.46%)  0.0B/op        fastest\n```\n\n#### `property` vs `getter_and_setter` [code](code/general/property-vs-getter_and_setter.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/general/property-vs-getter_and_setter code/general/property-vs-getter_and_setter.cr\n$ ./bin/code/general/property-vs-getter_and_setter\n\n         property  50.89M ( 19.65ns) (± 5.34%)  32.0B/op        fastest\ngetter_and_setter  49.68M ( 20.13ns) (± 7.27%)  32.0B/op   1.02× slower\n```\n\n### Hash\n\n#### `[]?` vs `has_key?` [code](code/hash/[]?-vs-has_key?.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/hash/[]?-vs-has_key? code/hash/[]?-vs-has_key?.cr\n$ ./bin/code/hash/[]?-vs-has_key?\n\n     Hash#[]?  41.12M ( 24.32ns) (±12.09%)  0.0B/op   1.01× slower\nHash#has_key?  41.48M ( 24.11ns) (± 8.25%)  0.0B/op        fastest\n```\n\n#### `bracket` vs `fetch` [code](code/hash/bracket-vs-fetch.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/hash/bracket-vs-fetch code/hash/bracket-vs-fetch.cr\n$ ./bin/code/hash/bracket-vs-fetch\n\n   Hash#[]  95.60M ( 10.46ns) (± 6.16%)  0.0B/op   1.02× slower\nHash#fetch  97.08M ( 10.30ns) (± 9.36%)  0.0B/op        fastest\n```\n\n#### `clone` vs `dup` [code](code/hash/clone-vs-dup.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/hash/clone-vs-dup code/hash/clone-vs-dup.cr\n$ ./bin/code/hash/clone-vs-dup\n\n  Hash#dup   5.39M (185.50ns) (±17.96%)    480B/op        fastest\nHash#clone 293.35k (  3.41µs) (±10.17%)  5.94kB/op  18.38× slower\n```\n\n#### `keys each` vs `each_key` [code](code/hash/keys-each-vs-each_key.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/hash/keys-each-vs-each_key code/hash/keys-each-vs-each_key.cr\n$ ./bin/code/hash/keys-each-vs-each_key\n\nHash#keys.each   4.25M (235.11ns) (± 8.09%)  240B/op   1.11× slower\n Hash#each_key   4.71M (212.43ns) (±22.16%)  160B/op        fastest\n```\n\n#### `merge bang` vs `[]=` [code](code/hash/merge-bang-vs-[]=.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/hash/merge-bang-vs-[]= code/hash/merge-bang-vs-[]=.cr\n$ ./bin/code/hash/merge-bang-vs-[]=\n\nHash#merge!  67.40k ( 14.84µs) (±23.77%)  16.6kB/op   4.19× slower\n   Hash#[]= 282.73k (  3.54µs) (±21.37%)  4.14kB/op        fastest\n```\n\n### Namedtuple\n\n#### `bracket` vs `fetch` [code](code/namedtuple/bracket-vs-fetch.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/namedtuple/bracket-vs-fetch code/namedtuple/bracket-vs-fetch.cr\n$ ./bin/code/namedtuple/bracket-vs-fetch\n\n   NamedTuple#[] 294.37M (  3.40ns) (±19.52%)  0.0B/op   1.00× slower\nNamedTuple#fetch 295.49M (  3.38ns) (±19.80%)  0.0B/op        fastest\n```\n\n#### `fetch` vs `fetch_with_block` [code](code/namedtuple/fetch-vs-fetch_with_block.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/namedtuple/fetch-vs-fetch_with_block code/namedtuple/fetch-vs-fetch_with_block.cr\n$ ./bin/code/namedtuple/fetch-vs-fetch_with_block\n\nNamedTuple#fetch + const 168.24M (  5.94ns) (± 6.53%)  0.0B/op   1.81× slower\nNamedTuple#fetch + block 304.53M (  3.28ns) (± 4.50%)  0.0B/op        fastest\n  NamedTuple#fetch + arg 296.07M (  3.38ns) (± 6.99%)  0.0B/op   1.03× slower\n```\n\n### Proc \u0026 Block\n\n#### `block` vs `to_proc` [code](code/proc-and-block/block-vs-to_proc.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/proc-and-block/block-vs-to_proc code/proc-and-block/block-vs-to_proc.cr\n$ ./bin/code/proc-and-block/block-vs-to_proc\n\n         Block 331.06k (  3.02µs) (±13.18%)  2.6kB/op   1.10× slower\nSymbol#to_proc 362.78k (  2.76µs) (± 5.27%)  2.6kB/op        fastest\n```\n\n#### `proc call` vs `yield` [code](code/proc-and-block/proc-call-vs-yield.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/proc-and-block/proc-call-vs-yield code/proc-and-block/proc-call-vs-yield.cr\n$ ./bin/code/proc-and-block/proc-call-vs-yield\n\n    block.call 513.72M (  1.95ns) (± 4.51%)  0.0B/op        fastest\n block + yield 501.67M (  1.99ns) (± 7.25%)  0.0B/op   1.02× slower\nblock argument 512.94M (  1.95ns) (± 5.41%)  0.0B/op   1.00× slower\n         yield 482.96M (  2.07ns) (±15.43%)  0.0B/op   1.06× slower\n```\n\n### String\n\n#### Concatenation [code](code/string/concatenation.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/string/concatenation code/string/concatenation.cr\n$ ./bin/code/string/concatenation\n\n String#+  44.62M ( 22.41ns) (± 8.00%)  32.0B/op        fastest\nString#{}  23.68M ( 42.22ns) (±16.74%)  32.0B/op   1.88× slower\n String#%   4.28M (233.43ns) (±20.03%)   176B/op  10.41× slower\n```\n\n#### `ends string-matching-match` vs `end_with` [code](code/string/ends-string-matching-match-vs-end_with.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/string/ends-string-matching-match-vs-end_with code/string/ends-string-matching-match-vs-end_with.cr\n$ ./bin/code/string/ends-string-matching-match-vs-end_with\n\nString#end_with? 238.71M (  4.19ns) (±11.61%)   0.0B/op        fastest\n       String#=~   7.93M (126.04ns) (± 4.61%)  16.0B/op  30.09× slower\n```\n\n#### Equal-substring-of-char [code](code/string/equal-substring-of-char.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/string/equal-substring-of-char code/string/equal-substring-of-char.cr\n$ ./bin/code/string/equal-substring-of-char\n\n         \"===\"[0] == '=' 298.29M (  3.35ns) (± 7.06%)   0.0B/op        fastest\n    \"===\"[0].to_s == \"=\"  23.29M ( 42.94ns) (± 6.52%)  48.0B/op  12.81× slower\n\"===\"[0] == \"=\".chars[0]  27.62M ( 36.21ns) (± 4.66%)  48.0B/op  10.80× slower\n```\n\n#### `equal` vs `match` [code](code/string/equal-vs-match.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/string/equal-vs-match code/string/equal-vs-match.cr\n$ ./bin/code/string/equal-vs-match\n\nString#match  15.00M ( 66.65ns) (± 8.74%)  16.0B/op   1.02× slower\n  Regexp#===  15.32M ( 65.27ns) (± 9.61%)  16.0B/op        fastest\n   String#=~  14.67M ( 68.17ns) (± 8.60%)  16.0B/op   1.04× slower\n```\n\n#### `gsub` vs `sub` [code](code/string/gsub-vs-sub.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/string/gsub-vs-sub code/string/gsub-vs-sub.cr\n$ ./bin/code/string/gsub-vs-sub\n\n String#sub   3.67M (272.77ns) (± 5.43%)  1.22kB/op        fastest\nString#gsub   1.37M (728.87ns) (± 4.13%)  1.22kB/op   2.67× slower\n```\n\n#### `includes` vs `to_s.includes` [code](code/string/includes-vs-to_s.includes.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/string/includes-vs-to_s.includes code/string/includes-vs-to_s.includes.cr\n$ ./bin/code/string/includes-vs-to_s.includes\n\n  String#includes? 368.22M (  2.72ns) (± 8.30%)  0.0B/op   1.02× slower\nNil#to_s#includes? 376.21M (  2.66ns) (± 6.76%)  0.0B/op        fastest\n```\n\n#### `nil` vs `to_s.empty` [code](code/string/nil-vs-to_s.empty.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/string/nil-vs-to_s.empty code/string/nil-vs-to_s.empty.cr\n$ ./bin/code/string/nil-vs-to_s.empty\n\n    String#nil? 468.25M (  2.14ns) (±14.49%)  0.0B/op        fastest\nNil#to_s#empty? 450.24M (  2.22ns) (±14.74%)  0.0B/op   1.04× slower\n```\n\n#### `sub` vs `chomp` [code](code/string/sub-vs-chomp.cr)\n\n```\n$ crystal build --release --no-debug -o bin/code/string/sub-vs-chomp code/string/sub-vs-chomp.cr\n$ ./bin/code/string/sub-vs-chomp\n\nString#chomp\"string\"  43.85M ( 22.81ns) (±12.35%)  32.0B/op        fastest\n  String#sub/regexp/   3.57M (280.13ns) (± 5.92%)   176B/op  12.28× slower\n```\n\n## You may also like\n\n- [halite](https://github.com/icyleaf/halite) - HTTP Requests Client with a chainable REST API, built-in sessions and middlewares.\n- [totem](https://github.com/icyleaf/totem) - Load and parse a configuration file or string in JSON, YAML, dotenv formats.\n- [markd](https://github.com/icyleaf/markd) - Yet another markdown parser built for speed, Compliant to CommonMark specification.\n- [poncho](https://github.com/icyleaf/poncho) - A .env parser/loader improved for performance.\n- [popcorn](https://github.com/icyleaf/popcorn) - Easy and Safe casting from one type to another.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ficyleaf%2Ffast-crystal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ficyleaf%2Ffast-crystal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ficyleaf%2Ffast-crystal/lists"}