Skip to content
  • Koichi Sasada's avatar
    b1b73936
    `Primitive.mandatory_only?` for fast path · b1b73936
    Koichi Sasada authored
    Compare with the C methods, A built-in methods written in Ruby is
    slower if only mandatory parameters are given because it needs to
    check the argumens and fill default values for optional and keyword
    parameters (C methods can check the number of parameters with `argc`,
    so there are no overhead). Passing mandatory arguments are common
    (optional arguments are exceptional, in many cases) so it is important
    to provide the fast path for such common cases.
    
    `Primitive.mandatory_only?` is a special builtin function used with
    `if` expression like that:
    
    ```ruby
      def self.at(time, subsec = false, unit = :microsecond, in: nil)
        if Primitive.mandatory_only?
          Primitive.time_s_at1(time)
        else
          Primitive.time_s_at(time, subsec, unit, Primitive.arg!(:in))
        end
      end
    ```
    
    and it makes two ISeq,
    
    ```
      def self.at(time, subsec = false, unit = :microsecond, in: nil)
        Primitive.time_s_at(time, subsec, unit, Primitive.arg!(:in))
      end
    
      def self.at(time)
        Primitive.time_s_at1(time)
      end
    ```
    
    and (2) is pointed by (1). Note that `Primitive.mandatory_only?`
    should be used only in a condition of an `if` statement and the
    `if` statement should be equal to the methdo body (you can not
    put any expression before and after the `if` statement).
    
    A method entry with `mandatory_only?` (`Time.at` on the above case)
    is marked as `iseq_overload`. When the method will be dispatch only
    with mandatory arguments (`Time.at(0)` for example), make another
    method entry with ISeq (2) as mandatory only method entry and it
    will be cached in an inline method cache.
    
    The idea is similar discussed in https://bugs.ruby-lang.org/issues/16254
    but it only checks mandatory parameters or more, because many cases
    only mandatory parameters are given. If we find other cases (optional
    or keyword parameters are used frequently and it hurts performance),
    we can extend the feature.
    b1b73936
    `Primitive.mandatory_only?` for fast path
    Koichi Sasada authored
    Compare with the C methods, A built-in methods written in Ruby is
    slower if only mandatory parameters are given because it needs to
    check the argumens and fill default values for optional and keyword
    parameters (C methods can check the number of parameters with `argc`,
    so there are no overhead). Passing mandatory arguments are common
    (optional arguments are exceptional, in many cases) so it is important
    to provide the fast path for such common cases.
    
    `Primitive.mandatory_only?` is a special builtin function used with
    `if` expression like that:
    
    ```ruby
      def self.at(time, subsec = false, unit = :microsecond, in: nil)
        if Primitive.mandatory_only?
          Primitive.time_s_at1(time)
        else
          Primitive.time_s_at(time, subsec, unit, Primitive.arg!(:in))
        end
      end
    ```
    
    and it makes two ISeq,
    
    ```
      def self.at(time, subsec = false, unit = :microsecond, in: nil)
        Primitive.time_s_at(time, subsec, unit, Primitive.arg!(:in))
      end
    
      def self.at(time)
        Primitive.time_s_at1(time)
      end
    ```
    
    and (2) is pointed by (1). Note that `Primitive.mandatory_only?`
    should be used only in a condition of an `if` statement and the
    `if` statement should be equal to the methdo body (you can not
    put any expression before and after the `if` statement).
    
    A method entry with `mandatory_only?` (`Time.at` on the above case)
    is marked as `iseq_overload`. When the method will be dispatch only
    with mandatory arguments (`Time.at(0)` for example), make another
    method entry with ISeq (2) as mandatory only method entry and it
    will be cached in an inline method cache.
    
    The idea is similar discussed in https://bugs.ruby-lang.org/issues/16254
    but it only checks mandatory parameters or more, because many cases
    only mandatory parameters are given. If we find other cases (optional
    or keyword parameters are used frequently and it hurts performance),
    we can extend the feature.
Loading