[ruby-core:97000] [Ruby master Feature#16562] Expose rb_io_set_encoding_internal to reduce function calls on loading source files
From:
shyouhei@...
Date:
2020-01-27 01:15:22 UTC
List:
ruby-core #97000
Issue #16562 has been updated by shyouhei (Shyouhei Urabe). This might be a nitpick but, can you tell us the reason why rb_io_set_encod= ing_internal has to be exposed (that is, callable from 3rd party extension = libraries)? I understand it needs to be non-`static` but it seems not need= to be truly globally visible. I guess I missed something. ---------------------------------------- Feature #16562: Expose rb_io_set_encoding_internal to reduce function calls= on loading source files https://bugs.ruby-lang.org/issues/16562#change-84058 * Author: methodmissing (Lourens Naud=E9) * Status: Open * Priority: Normal * Assignee: = * Target version: = ---------------------------------------- References https://github.com/ruby/ruby/pull/2829 Removes a few `rb_funcall` calls from source file reading and the AST loade= r. * `rb_ast_parse_file`: removes 1 x `rb_funcall`, removes 1 transient string= allocation (`"-"`) * `load_file_internal`: removes 3 x `rb_funcall`, removes 1 transient strin= g allocation (`"-"`) * Removes a branch from `rb_io_set_encoding` which checks for a T_FILE type= which I could not take with ruby tests or Rails (asserted with an inline `= rb_bug` for backtrace :smile: ). I declare it dead * Removes static symbol `id_set_encoding` from `io.c` * Introduces a literal fstring `str_no_transcoding` to represent the no tra= nscoding option `"-"` Now ... I don't think I like the API naming convention of `rb_io_set_encodi= ng_internal` very much for the following reason: with `internal` it means n= ot public API (but then again declaring it in `ruby/io.h` implies that too,= but can also be interpreted as `internal encoding`, which can be confusing. Open to ideas about the API and also the special `Qfalse` argument which as= signs the no transcoding special case. Master booting Redmine with Rails 6: ``` [RUBY_DEBUG_COUNTER] obj_newobj 2095742 [RUBY_DEBUG_COUNTER] frame_push_cfunc 2217390 ``` This PR: ``` [RUBY_DEBUG_COUNTER] obj_newobj 2093369 [RUBY_DEBUG_COUNTER] frame_push_cfunc 2212686 ``` Diffs: * `4704` less C function calls (my understanding is `rb_call` and friends w= ould bump `frame_push_cfunc`) * `2373` less transient objects allocated (about half of the dispatch calls= also allocated a "-" string) Which is about inline with the loaded features for booting the process: ``` irb(main):002:0> $LOADED_FEATURES.size =3D> 2165 ``` -- = https://bugs.ruby-lang.org/ Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=3Dunsubscribe> <http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>