From 30e6a197df1f141c00117e5a2328df63e340b2ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafael=20Mendon=C3=A7a=20Fran=C3=A7a?= Date: Thu, 23 May 2024 18:28:48 +0000 Subject: [PATCH] Move plumbing to enable yjit to inside the framework There is no reason to expose all those details to users and this has the benefit that now are can ensure that the YJIT is enabled after all initialization is done. --- guides/source/configuring.md | 11 +++++++++++ railties/lib/rails/application/configuration.rb | 5 ++++- railties/lib/rails/application/finisher.rb | 6 ++++++ .../templates/config/initializers/enable_yjit.rb.tt | 11 ----------- railties/test/generators/app_generator_test.rb | 1 - railties/test/generators/plugin_generator_test.rb | 1 - 6 files changed, 21 insertions(+), 14 deletions(-) delete mode 100644 railties/lib/rails/generators/rails/app/templates/config/initializers/enable_yjit.rb.tt diff --git a/guides/source/configuring.md b/guides/source/configuring.md index b581609cb0bfc..72b90e1029f9e 100644 --- a/guides/source/configuring.md +++ b/guides/source/configuring.md @@ -65,6 +65,7 @@ Below are the default values associated with each target version. In cases of co - [`config.active_record.postgresql_adapter_decode_dates`](#config-active-record-postgresql-adapter-decode-dates): `true` - [`config.active_record.validate_migration_timestamps`](#config-active-record-validate-migration-timestamps): `true` - [`config.active_storage.web_image_content_types`](#config-active-storage-web-image-content-types): `%w[image/png image/jpeg image/gif image/webp]` +- [`config.yjit`](#config-yjit): `true` #### Default Values for Target Version 7.1 @@ -613,6 +614,16 @@ Used to easily add nested custom configuration to the application config object See [Custom Configuration](#custom-configuration) +#### `config.yjit` + +Enables YJIT as of Ruby 3.3, to bring sizeable performance improvements. If you are +deploying to a memory constrained environment you may want to set this to `false`. + +| Starting with version | The default value is | +| --------------------- | -------------------- | +| (original) | `false` | +| 7.2 | `true` | + ### Configuring Assets #### `config.assets.css_compressor` diff --git a/railties/lib/rails/application/configuration.rb b/railties/lib/rails/application/configuration.rb index c400d23c61717..942a06ee22320 100644 --- a/railties/lib/rails/application/configuration.rb +++ b/railties/lib/rails/application/configuration.rb @@ -23,7 +23,7 @@ class Configuration < ::Rails::Engine::Configuration :content_security_policy_nonce_generator, :content_security_policy_nonce_directives, :require_master_key, :credentials, :disable_sandbox, :sandbox_by_default, :add_autoload_paths_to_load_path, :rake_eager_load, :server_timing, :log_file_size, - :dom_testing_default_html_version + :dom_testing_default_html_version, :yjit attr_reader :encoding, :api_only, :loaded_config_version, :log_level @@ -81,6 +81,7 @@ def initialize(*) @rake_eager_load = false @server_timing = false @dom_testing_default_html_version = :html4 + @yjit = false end # Loads default configuration values for a target version. This includes @@ -318,6 +319,8 @@ def load_defaults(target_version) when "7.2" load_defaults "7.1" + self.yjit = true + if respond_to?(:active_job) active_job.enqueue_after_transaction_commit = :default end diff --git a/railties/lib/rails/application/finisher.rb b/railties/lib/rails/application/finisher.rb index f144b45009855..61a7be9291b91 100644 --- a/railties/lib/rails/application/finisher.rb +++ b/railties/lib/rails/application/finisher.rb @@ -231,6 +231,12 @@ def self.complete(_state) ActiveSupport::DescendantsTracker.disable_clear! end end + + initializer :enable_yjit do + if config.yjit && defined?(RubyVM::YJIT.enable) + RubyVM::YJIT.enable + end + end end end end diff --git a/railties/lib/rails/generators/rails/app/templates/config/initializers/enable_yjit.rb.tt b/railties/lib/rails/generators/rails/app/templates/config/initializers/enable_yjit.rb.tt deleted file mode 100644 index 7b1d025460d92..0000000000000 --- a/railties/lib/rails/generators/rails/app/templates/config/initializers/enable_yjit.rb.tt +++ /dev/null @@ -1,11 +0,0 @@ -# Automatically enable YJIT as of Ruby 3.3, as it brings very -# sizeable performance improvements. - -# If you are deploying to a memory constrained environment -# you may want to delete this file, but otherwise it's free -# performance. -if defined?(RubyVM::YJIT.enable) - Rails.application.config.after_initialize do - RubyVM::YJIT.enable - end -end diff --git a/railties/test/generators/app_generator_test.rb b/railties/test/generators/app_generator_test.rb index 2534f5de057cb..4970987507e94 100644 --- a/railties/test/generators/app_generator_test.rb +++ b/railties/test/generators/app_generator_test.rb @@ -55,7 +55,6 @@ config/environments/test.rb config/initializers/assets.rb config/initializers/content_security_policy.rb - config/initializers/enable_yjit.rb config/initializers/filter_parameter_logging.rb config/initializers/inflections.rb config/initializers/permissions_policy.rb diff --git a/railties/test/generators/plugin_generator_test.rb b/railties/test/generators/plugin_generator_test.rb index 40e14e9bb5858..070d0547506a5 100644 --- a/railties/test/generators/plugin_generator_test.rb +++ b/railties/test/generators/plugin_generator_test.rb @@ -54,7 +54,6 @@ test/dummy/config/environments/production.rb test/dummy/config/environments/test.rb test/dummy/config/initializers/content_security_policy.rb - test/dummy/config/initializers/enable_yjit.rb test/dummy/config/initializers/filter_parameter_logging.rb test/dummy/config/initializers/inflections.rb test/dummy/config/initializers/permissions_policy.rb