[ruby-core:112552] [Ruby master Bug#19461] Time.local performance tanks in forked process (on macOS only?)

Issue #19461 has been reported by ioquatix (Samuel Williams). ---------------------------------------- Bug #19461: Time.local performance tanks in forked process (on macOS only?) https://bugs.ruby-lang.org/issues/19461 * Author: ioquatix (Samuel Williams) * Status: Open * Priority: Normal * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- The following program demonstrates a performance regression in forked child processes when invoking `Time.local`: ```ruby require 'benchmark' require 'time' def sir_local_alot result = Benchmark.measure do 10_000.times do tm = ::Time.local(2023) end end $stderr.puts result end sir_local_alot pid = fork do sir_local_alot end Process.wait(pid) ``` On Linux the performance is similar, but on macOS, the performance is over 100x worse on my M1 laptop. -- https://bugs.ruby-lang.org/

Issue #19461 has been updated by PvpDJgHP (— PvpDJgHP). In Dec 2016, someone investigated a related question and posted here: https://stackoverflow.com/questions/41353532/41371753#41371753 This person's findings may be helpful. ---------------------------------------- Bug #19461: Time.local performance tanks in forked process (on macOS only?) https://bugs.ruby-lang.org/issues/19461#change-102017 * Author: ioquatix (Samuel Williams) * Status: Open * Priority: Normal * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- The following program demonstrates a performance regression in forked child processes when invoking `Time.local`: ```ruby require 'benchmark' require 'time' def sir_local_alot result = Benchmark.measure do 10_000.times do tm = ::Time.local(2023) end end $stderr.puts result end sir_local_alot pid = fork do sir_local_alot end Process.wait(pid) ``` On Linux the performance is similar, but on macOS, the performance is over 100x worse on my M1 laptop. -- https://bugs.ruby-lang.org/

Issue #19461 has been updated by ioquatix (Samuel Williams). Thanks, that's quite an epic Q/A. ---------------------------------------- Bug #19461: Time.local performance tanks in forked process (on macOS only?) https://bugs.ruby-lang.org/issues/19461#change-102018 * Author: ioquatix (Samuel Williams) * Status: Open * Priority: Normal * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- The following program demonstrates a performance regression in forked child processes when invoking `Time.local`: ```ruby require 'benchmark' require 'time' def sir_local_alot result = Benchmark.measure do 10_000.times do tm = ::Time.local(2023) end end $stderr.puts result end sir_local_alot pid = fork do sir_local_alot end Process.wait(pid) ``` On Linux the performance is similar, but on macOS, the performance is over 100x worse on my M1 laptop. -- https://bugs.ruby-lang.org/

Issue #19461 has been updated by nobu (Nobuyoshi Nakada). File localtime_test.c added Seems unrelated to Ruby. ``` $ sw_vers ProductName: macOS ProductVersion: 13.2.1 BuildVersion: 22D68 $ clang localtime_test.c && ./a.out && ./a.out r Measuring localtime In parent monotonic = 0.002226000 cputime = 0.001949000 In child monotonic = 0.581383000 cputime = 0.580938000 Measuring localtime_r In parent monotonic = 0.002409000 cputime = 0.001967000 In child monotonic = 0.587200000 cputime = 0.586385000 ``` ---------------------------------------- Bug #19461: Time.local performance tanks in forked process (on macOS only?) https://bugs.ruby-lang.org/issues/19461#change-102019 * Author: ioquatix (Samuel Williams) * Status: Open * Priority: Normal * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- The following program demonstrates a performance regression in forked child processes when invoking `Time.local`: ```ruby require 'benchmark' require 'time' def sir_local_alot result = Benchmark.measure do 10_000.times do tm = ::Time.local(2023) end end $stderr.puts result end sir_local_alot pid = fork do sir_local_alot end Process.wait(pid) ``` On Linux the performance is similar, but on macOS, the performance is over 100x worse on my M1 laptop. ---Files-------------------------------- localtime_test.c (1.28 KB) -- https://bugs.ruby-lang.org/

Issue #19461 has been updated by nobu (Nobuyoshi Nakada). File localtime_test.c added Rewritten. ``` $ clang localtime_test.c && ./a.out Measuring in parent localtime_r = 0.002384000 localtime = 0.001939000 Measuring in child localtime_r = 0.576143000 localtime = 0.591077000 ``` ---------------------------------------- Bug #19461: Time.local performance tanks in forked process (on macOS only?) https://bugs.ruby-lang.org/issues/19461#change-102020 * Author: ioquatix (Samuel Williams) * Status: Open * Priority: Normal * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- The following program demonstrates a performance regression in forked child processes when invoking `Time.local`: ```ruby require 'benchmark' require 'time' def sir_local_alot result = Benchmark.measure do 10_000.times do tm = ::Time.local(2023) end end $stderr.puts result end sir_local_alot pid = fork do sir_local_alot end Process.wait(pid) ``` On Linux the performance is similar, but on macOS, the performance is over 100x worse on my M1 laptop. ---Files-------------------------------- localtime_test.c (1.28 KB) localtime_test.c (1.21 KB) -- https://bugs.ruby-lang.org/

Issue #19461 has been updated by ioquatix (Samuel Williams). Wow, it's like 500x slower. According to the stack overflow discussion, some how this does not affect Python, so maybe it's something about the function we are using in the C standard library. 100% agree it's Darwin's problem but indirectly became Ruby's problem. ---------------------------------------- Bug #19461: Time.local performance tanks in forked process (on macOS only?) https://bugs.ruby-lang.org/issues/19461#change-102031 * Author: ioquatix (Samuel Williams) * Status: Open * Priority: Normal * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- The following program demonstrates a performance regression in forked child processes when invoking `Time.local`: ```ruby require 'benchmark' require 'time' def sir_local_alot result = Benchmark.measure do 10_000.times do tm = ::Time.local(2023) end end $stderr.puts result end sir_local_alot pid = fork do sir_local_alot end Process.wait(pid) ``` On Linux the performance is similar, but on macOS, the performance is over 100x worse on my M1 laptop. ---Files-------------------------------- localtime_test.c (1.28 KB) localtime_test.c (1.21 KB) -- https://bugs.ruby-lang.org/

Issue #19461 has been updated by ioquatix (Samuel Williams). File clipboard-202302251716-rh6ma.png added I've submitted a bug report to Apple:  ---------------------------------------- Bug #19461: Time.local performance tanks in forked process (on macOS only?) https://bugs.ruby-lang.org/issues/19461#change-102040 * Author: ioquatix (Samuel Williams) * Status: Open * Priority: Normal * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- The following program demonstrates a performance regression in forked child processes when invoking `Time.local`: ```ruby require 'benchmark' require 'time' def sir_local_alot result = Benchmark.measure do 10_000.times do tm = ::Time.local(2023) end end $stderr.puts result end sir_local_alot pid = fork do sir_local_alot end Process.wait(pid) ``` On Linux the performance is similar, but on macOS, the performance is over 100x worse on my M1 laptop. ---Files-------------------------------- localtime_test.c (1.28 KB) localtime_test.c (1.21 KB) clipboard-202302251716-rh6ma.png (234 KB) -- https://bugs.ruby-lang.org/

Issue #19461 has been updated by ioquatix (Samuel Williams). Status changed from Open to Closed I don't think we can do anything about this, so closing. ---------------------------------------- Bug #19461: Time.local performance tanks in forked process (on macOS only?) https://bugs.ruby-lang.org/issues/19461#change-102041 * Author: ioquatix (Samuel Williams) * Status: Closed * Priority: Normal * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- The following program demonstrates a performance regression in forked child processes when invoking `Time.local`: ```ruby require 'benchmark' require 'time' def sir_local_alot result = Benchmark.measure do 10_000.times do tm = ::Time.local(2023) end end $stderr.puts result end sir_local_alot pid = fork do sir_local_alot end Process.wait(pid) ``` On Linux the performance is similar, but on macOS, the performance is over 100x worse on my M1 laptop. ---Files-------------------------------- localtime_test.c (1.28 KB) localtime_test.c (1.21 KB) clipboard-202302251716-rh6ma.png (234 KB) -- https://bugs.ruby-lang.org/

Issue #19461 has been updated by lars.vonk@gmail.com (Lars Vonk). Hi, we are running into the same issue when developing so I was wondering if you got any response on the Apple bug report? Or found a workaround? ---------------------------------------- Bug #19461: Time.local performance tanks in forked process (on macOS only?) https://bugs.ruby-lang.org/issues/19461#change-106575 * Author: ioquatix (Samuel Williams) * Status: Closed * Priority: Normal * Backport: 2.7: UNKNOWN, 3.0: UNKNOWN, 3.1: UNKNOWN, 3.2: UNKNOWN ---------------------------------------- The following program demonstrates a performance regression in forked child processes when invoking `Time.local`: ```ruby require 'benchmark' require 'time' def sir_local_alot result = Benchmark.measure do 10_000.times do tm = ::Time.local(2023) end end $stderr.puts result end sir_local_alot pid = fork do sir_local_alot end Process.wait(pid) ``` On Linux the performance is similar, but on macOS, the performance is over 100x worse on my M1 laptop. ---Files-------------------------------- localtime_test.c (1.28 KB) localtime_test.c (1.21 KB) clipboard-202302251716-rh6ma.png (234 KB) -- https://bugs.ruby-lang.org/
participants (4)
-
ioquatix (Samuel Williams)
-
lars.vonk@gmail.com (Lars Vonk)
-
nobu (Nobuyoshi Nakada)
-
PvpDJgHP