From: "byroot (Jean Boussier) via ruby-core" Date: 2026-02-02T10:16:28+00:00 Subject: [ruby-core:124656] [Ruby Bug#21856] Nokogiri performance degradation since Ruby 4.0 Issue #21856 has been updated by byroot (Jean Boussier). I'm able to repro on my machine, even though the different isn't quite as bad (more like 30% slower). Profile of ruby 3.4.7: https://share.firefox.dev/4rw3mv0 Profile of ruby 4.0.0: https://share.firefox.dev/4rtvrmt The striking difference on the profile seem to be that 4.0 spends 28% of its time in `remove_class_from_subclasses` -> `rb_classext_free_subclasses` -> `rb_iclass_classext_free` -> `rb_classext_foreach` -> `rb_obj_free`. A few notes: - This codepath was changed a lot with the `Ruby::Box` introduction, it may have become significantly slower. - It's surprising that we're sweeping lots of Class object, perhaps `Loofah` or `Nokogiri` are inadvertently allocating singleton classes in a hot spot? ---------------------------------------- Bug #21856: Nokogiri performance degradation since Ruby 4.0 https://bugs.ruby-lang.org/issues/21856#change-116251 * Author: ahorek (Pavel Rosick�) * Status: Open * ruby -v: ruby 4.1.0dev (2026-01-31T09:41:30Z master 7ef8c470d2) +PRISM [x86_64-linux] * Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN, 4.0: UNKNOWN ---------------------------------------- Loofah sanitization is noticeably slower ``` Ruby: 3.4.8 Loofah: 2.25.0 Nokogiri: 1.19.0 Iterations: 100000 user system total real Loofah.fragment + scrub!(:prune) 26.091872 0.000000 26.091872 ( 25.110925) Loofah.scrub_fragment(:prune) 25.913185 0.010392 25.923577 ( 24.948464) Nokogiri HTML parse only 3.852690 0.000000 3.852690 ( 3.705930) Ruby: 4.0.0 & 4.0.1 Loofah: 2.25.0 Nokogiri: 1.19.0 Iterations: 100000 user system total real Loofah.fragment + scrub!(:prune) 38.094207 0.041753 38.135960 ( 36.669463) Loofah.scrub_fragment(:prune) 40.168795 0.000045 40.168840 ( 38.561806) Nokogiri HTML parse only 4.012936 0.052024 4.064960 ( 3.913272) Ruby: 4.1.0 (ruby 4.1.0dev (2026-01-31T09:41:30Z master 7ef8c470d2) +PRISM [x86_64-linux]) Loofah: 2.25.0 Nokogiri: 1.19.0 Iterations: 100000 user system total real Loofah.fragment + scrub!(:prune) 39.004228 0.000000 39.004228 ( 37.694873) Loofah.scrub_fragment(:prune) 39.043199 0.031284 39.074483 ( 37.182785) Nokogiri HTML parse only 3.889100 0.010427 3.899527 ( 3.741622) ``` Originally reported https://www.redmine.org/issues/43737 ---Files-------------------------------- benchmark.rb (1002 Bytes) -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/