Project

General

Profile

Actions

Misc #15014

closed

thread.c: use rb_hrtime_scalar for high-resolution time operations

Added by normalperson (Eric Wong) over 6 years ago. Updated about 6 years ago.

Status:
Closed
Assignee:
-
[ruby-core:88582]

Description

thread.c: use rb_hrtime_t scalar for high-resolution time operations

Relying on "struct timespec" was too annoying API-wise and
used more stack space. "double" was a bit wacky w.r.t rounding
in the past, so now we'll switch to using a 64-bit type.

Unsigned 64-bit integer is able to give us over nearly 585
years of range with nanoseconds. This range is good enough
for the Linux kernel internal time representation, so it
ought to be good enough for us.

This reduces the stack usage of functions while GVL is held
(and thus subject to marking) on x86-64 Linux (with ppoll):

rb_wait_for_single_fd    120 => 104
do_select                120 => 88

I plan on using this for Timeout-in-VM [Feature #14859] and
auto-fiber [Feature #13618].


Files

Updated by MSP-Greg (Greg L) over 6 years ago

@normalperson (Eric Wong) Eric,

At r64493, ruby-loco built successfully using the abiove patch, Thanks, Greg

Updated by normalperson (Eric Wong) over 6 years ago

wrote:

At r64493, ruby-loco built successfully using the abiove patch, Thanks, Greg

Thanks! I don't know when I'll commit this, yet.

Updated by ko1 (Koichi Sasada) about 6 years ago

Just a comment.
API references (a list of provided functions with a comment) at the beginning of the hrtime.h will help us.

Updated by normalperson (Eric Wong) about 6 years ago

wrote:

Just a comment.

API references (a list of provided functions with a comment) at the beginning of the hrtime.h will help us.

OK, updated:
https://80x24.org/spew/20180823103503.29516-1-e@80x24.org/raw

(Should have Thread::Coro (auto-fiber) update using that, soon,
so the benefit will become more apparent, but personal crap
keeps getting in the way of hacking :<)

Actions #5

Updated by normalperson (Eric Wong) about 6 years ago

  • Status changed from Open to Closed

Applied in changeset trunk|r64533.


thread.c: use rb_hrtime_t scalar for high-resolution time operations

Relying on "struct timespec" was too annoying API-wise and
used more stack space. "double" was a bit wacky w.r.t rounding
in the past, so now we'll switch to using a 64-bit type.

Unsigned 64-bit integer is able to give us over nearly 585
years of range with nanoseconds. This range is good enough
for the Linux kernel internal time representation, so it
ought to be good enough for us.

This reduces the stack usage of functions while GVL is held
(and thus subject to marking) on x86-64 Linux (with ppoll):

rb_wait_for_single_fd    120 => 104
do_select                120 => 88

[ruby-core:88582] [Misc #15014]

Updated by ko1 (Koichi Sasada) about 6 years ago

Thanks!

    • Hi-res monotonic clock. It is currently nsec resolution, which has over 500 years of range (unsigned).

uint64?

MY_RUBY_BUILD_MAY_TIME_TRAVEL

what is this?

Updated by normalperson (Eric Wong) about 6 years ago

wrote:

Thanks!

    • Hi-res monotonic clock. It is currently nsec resolution, which has over 500 years of range (unsigned).

uint64?

You're welcome. Yep. Maybe some small systems can benefit with
usec/msec resolution and uint32_t, though.

However...

MY_RUBY_BUILD_MAY_TIME_TRAVEL

what is this?

A joke; at least as far as we know it is a joke :>

Updated by ko1 (Koichi Sasada) about 6 years ago

On 2018/08/27 16:16, Eric Wong wrote:

Yep. Maybe some small systems can benefit with
usec/msec resolution and uint32_t, though.

My comment is, if it assumes uint64_t, it is worth to write it
explicitly (I verified this years with 2^64/ (1000 * 1000 * 1000 * 60 * 60 * 24 * 365) on google, but it will help for readers).

MY_RUBY_BUILD_MAY_TIME_TRAVEL

what is this?

A joke; at least as far as we know it is a joke :>

I'm not sure why uint64_t doesn't solve time machine problem and
uint128_t solves it. Any RFC arguing it? (time machines should not leap
1.0790283e+22 years)?

Beside joking, I misunderstand that some systems can change the machine
time (time machine may means it) which affect monotonic time, and I
could not understand why uint128 can solve such system issue.

--
// SASADA Koichi at atdot dot net

Updated by normalperson (Eric Wong) about 6 years ago

Koichi Sasada wrote:

On 2018/08/27 16:16, Eric Wong wrote:

Yep. Maybe some small systems can benefit with
usec/msec resolution and uint32_t, though.

My comment is, if it assumes uint64_t, it is worth to write it explicitly (I
verified this years with 2^64/ (1000 * 1000 * 1000 * 60 * 60 * 24 * 365)
on google, but it will help for readers).

OK, I made r64554

MY_RUBY_BUILD_MAY_TIME_TRAVEL

what is this?

A joke; at least as far as we know it is a joke :>

I'm not sure why uint64_t doesn't solve time machine problem and uint128_t
solves it. Any RFC arguing it? (time machines should not leap 1.0790283e+22
years)?

It delays the onset of the problem. 585 years well within the
known range of human history; but 1.0790283e+22 years is much
farther away (probably beyond lifespan of the universe).

On the other hand, I don't know how a monotonic clock behaves
when a computer travels through time :>

Beside joking, I misunderstand that some systems can change the machine time
(time machine may means it) which affect monotonic time, and I could not
understand why uint128 can solve such system issue.

Right, if monotonic time goes out of uint64_t range, things will
break. Maybe int128 can hide the problem. But I don't think
it's something we need to care about, though (OS would be
broken, I think).

Updated by ko1 (Koichi Sasada) about 6 years ago

On 2018/08/27 18:17, Eric Wong wrote:

A joke; at least as far as we know it is a joke :>

I'm not sure why uint64_t doesn't solve time machine problem and uint128_t
solves it. Any RFC arguing it? (time machines should not leap 1.0790283e+22
years)?

It delays the onset of the problem. 585 years well within the
known range of human history; but 1.0790283e+22 years is much
farther away (probably beyond lifespan of the universe).

We need to a time machine to confirm it :p
(but ruby doesn't support it...
any other language runtime support it? :p)

Beside joking, I misunderstand that some systems can change the machine time
(time machine may means it) which affect monotonic time, and I could not
understand why uint128 can solve such system issue.
--
// SASADA Koichi at atdot dot net

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0