diff --git a/README.md b/README.md index 1eb1d16..37f2103 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ pairing with smart people at Hashrocket. For a steady stream of TILs, [sign up for my newsletter](https://crafty-builder-6996.ck.page/e169c61186). -_1592 TILs and counting..._ +_1593 TILs and counting..._ See some of the other learning resources I work on: - [Ruby Operator Lookup](https://www.visualmode.dev/ruby-operators) @@ -1319,6 +1319,7 @@ See some of the other learning resources I work on: - [Named Regex Captures Are Assigned To Variables](ruby/named-regex-captures-are-assigned-to-variables.md) - [Navigate Back In The Browser With Capybara](ruby/navigate-back-in-the-browser-with-capybara.md) - [Next And Previous Floats](ruby/next-and-previous-floats.md) +- [OpenStruct Has Bad Performance Characteristics](ruby/open-struct-has-bad-performance-characteristics.md) - [Or Operator Precedence](ruby/or-operator-precedence.md) - [Output Bytecode For A Ruby Program](ruby/output-bytecode-for-a-ruby-program.md) - [Override The Initial Sequence Value](ruby/override-the-initial-sequence-value.md) diff --git a/ruby/open-struct-has-bad-performance-characteristics.md b/ruby/open-struct-has-bad-performance-characteristics.md new file mode 100644 index 0000000..936b4c7 --- /dev/null +++ b/ruby/open-struct-has-bad-performance-characteristics.md @@ -0,0 +1,32 @@ +# OpenStruct Has Bad Performance Characteristics + +The Ruby docs for `OpenStruct` have a [_Caveats_ +section](https://ruby-doc.org/3.4.1/stdlibs/ostruct/OpenStruct.html#class-OpenStruct-label-Caveats) +that warns about the poor performance characteristics of `OpenStruct` relative +to `Struct` and `Hash`. + +> This should be a consideration if there is a concern about the performance of +> the objects that are created, as there is much more overhead in the setting +> of these properties compared to using a Hash or a Struct. Creating an open +> struct from a small Hash and accessing a few of the entries can be 200 times +> slower than accessing the hash directly. + +This doesn't mean don't use `OpenStruct`, but do be aware of if you are using +it in a hot path or if you are allocating and processing tons of them. + +If you turn on _Performance Warnings_ in Ruby, you'll see a warning message +when allocating an `OpenStruct`. + +```ruby +> require 'ostruct' +=> true +> os1 = OpenStruct.new +=> # +> Warning[:performance] = true +=> true +> os2 = OpenStruct.new +(irb):6: warning: OpenStruct use is discouraged for performance reasons +=> # +``` + +[source](https://www.reddit.com/r/ruby/comments/1d54mwl/comment/l6jgn59/)