Project

General

Profile

Actions

Bug #19461

closed

Time.local performance tanks in forked process (on macOS only?)

Added by ioquatix (Samuel Williams) about 1 year ago. Updated 3 months ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:112552]

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

localtime_test.c (1.28 KB) localtime_test.c nobu (Nobuyoshi Nakada), 02/24/2023 02:33 PM
localtime_test.c (1.21 KB) localtime_test.c nobu (Nobuyoshi Nakada), 02/24/2023 02:51 PM
clipboard-202302251716-rh6ma.png (234 KB) clipboard-202302251716-rh6ma.png ioquatix (Samuel Williams), 02/25/2023 04:16 AM
Actions #1

Updated by ioquatix (Samuel Williams) about 1 year ago

  • Description updated (diff)

Updated by PvpDJgHP (William Thomas NELSON) about 1 year ago

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.

Updated by ioquatix (Samuel Williams) about 1 year ago

Thanks, that's quite an epic Q/A.

Updated by nobu (Nobuyoshi Nakada) about 1 year ago

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

Updated by nobu (Nobuyoshi Nakada) about 1 year ago

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

Updated by ioquatix (Samuel Williams) about 1 year ago

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.

Updated by ioquatix (Samuel Williams) about 1 year ago

  • Status changed from Open to Closed

I don't think we can do anything about this, so closing.

Updated by lars.vonk@gmail.com (Lars Vonk) 3 months ago

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?

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0