Implement pure_ruby `EM.current time` by nevans · Pull Request #1015 · eventmachine/eventmachine · GitHub
Skip to content

Implement pure_ruby EM.current time#1015

Open
nevans wants to merge 10 commits into
eventmachine:masterfrom
nevans:pure_ruby/current_time
Open

Implement pure_ruby EM.current time#1015
nevans wants to merge 10 commits into
eventmachine:masterfrom
nevans:pure_ruby/current_time

Conversation

@nevans

@nevans nevans commented Feb 12, 2025

Copy link
Copy Markdown
Contributor

This already existed on EM::Reactor#current_loop_time, we just needed to forward to it from the singleton method on EM. This enables four more existing tests. They are very slow in pure ruby mode, but they do pass!

I converted the current_loop_time to use CLOCK_MONOTONIC, for the obvious reasons.

And current_loop_time is now stored as a microsecond integer (not a Time object):

  • Integer doesn't use ObjectSpace or malloc (prior to variable width allocation for Time).
    The reactor loop is the kind of hotspot where that's worth considering.
  • This matches the behavior of the C++ extension's EventMachine_t::GetRealTime().

@nevans nevans force-pushed the pure_ruby/current_time branch from b07872c to c571bcb Compare February 12, 2025 21:24
@nevans

nevans commented Feb 12, 2025

Copy link
Copy Markdown
Contributor Author

I don't know what's going on here, but it seems to faile consistently,
and it works fine under Windows with all other versions of ruby
(including 3.5-dev).
It feels the builds get randomly hit by one or more job that just go a
bit slower than the others which impacts the flakier tests.  With so
many jobs in the matrix, builds are almost guaranteed to get hit by at
least one of them behaving so badly that they fail.  Perhaps, by merging
the `pure_ruby` step into the build job, the odds of every job in the
matrix completing on the first attempt are improved.
This already existed on Reactor#current_loop_time, we just needed to
forward to it from the singleton method on `EM`.  For now, I kept the
same name for the Reactor attr_reader but added an alias to it.

This enables four existing tests.  They are very slow in pure ruby
mode, but they do pass!
This means that `Reactor.current_loop_time` will be seconds (as a Float)
not a Time object.  That should save some memory allocation, which is
nice for something like this that's updated every time through the loop.
Maybe there's a miniscule performance improvement by using Integer vs
Float, but that's not the primary motivation.  The goal was to match
the behavior of the C++ extension's `EventMachine_t::GetRealTime()`.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants