Bug #19461
closed
Time.local performance tanks in forked process (on macOS only?)
Added by ioquatix (Samuel Williams) over 1 year ago.
Updated 10 months ago.
Description
The following program demonstrates a performance regression in forked child processes when invoking Time.local
:
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
- Description updated (diff)
Thanks, that's quite an epic Q/A.
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
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
Wow, it's like 300x 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.
I've submitted a bug report to Apple:
- Status changed from Open to Closed
I don't think we can do anything about this, so closing.
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?
Also available in: Atom
PDF
Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0