<pre style='margin:0'>
Christopher Nielsen (mascguy) pushed a commit to branch master
in repository macports-legacy-support.
</pre>
<p><a href="https://github.com/macports/macports-legacy-support/commit/1abff6ed8b9ba570ed836906485a06e33e7ec172">https://github.com/macports/macports-legacy-support/commit/1abff6ed8b9ba570ed836906485a06e33e7ec172</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'> new 1abff6e clock_gettime: cache timebase - On versions of osx before 10.12, mach_timebase_info is a direct syscall (see dyld-239.3/glue.c#L434) which is order of magnitudes slower than the subsequent mach_absolute_time() call. Hence it's better to just cache it after the first call. - Since 10.12+, Apple also realized this and began caching mach_timebase_info calls at the libc layer (https://opensource.apple.com/source/xnu/xnu-3789.41.3/libsyscall/wrappers/mach_timebase_info.c.auto.html)
</span>1abff6e is described below
<span style='display:block; white-space:pre;color:#808000;'>commit 1abff6ed8b9ba570ed836906485a06e33e7ec172
</span>Author: krackers <krackers@users.noreply.github.com>
AuthorDate: Sun Jan 22 02:21:09 2023 -0800
<span style='display:block; white-space:pre;color:#404040;'> clock_gettime: cache timebase
</span><span style='display:block; white-space:pre;color:#404040;'> - On versions of osx before 10.12, mach_timebase_info is a direct syscall (see dyld-239.3/glue.c#L434) which is order of magnitudes slower than the subsequent mach_absolute_time() call. Hence it's better to just cache it after the first call.
</span><span style='display:block; white-space:pre;color:#404040;'> - Since 10.12+, Apple also realized this and began caching mach_timebase_info calls at the libc layer (https://opensource.apple.com/source/xnu/xnu-3789.41.3/libsyscall/wrappers/mach_timebase_info.c.auto.html)
</span>---
src/time.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/time.c b/src/time.c
</span><span style='display:block; white-space:pre;color:#808080;'>index fd1dcf9..c1b8036 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/time.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/time.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -31,7 +31,7 @@ int clock_gettime( clockid_t clk_id, struct timespec *ts )
</span> int ret = -1;
if ( ts )
{
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if ( CLOCK_REALTIME == clk_id )
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if ( CLOCK_REALTIME == clk_id )
</span> {
struct timeval tv;
ret = gettimeofday(&tv, NULL);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -40,10 +40,12 @@ int clock_gettime( clockid_t clk_id, struct timespec *ts )
</span> }
else if ( CLOCK_MONOTONIC == clk_id || CLOCK_MONOTONIC_RAW == clk_id )
{
<span style='display:block; white-space:pre;background:#ffe0e0;'>- const uint64_t clock = mach_absolute_time();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- mach_timebase_info_data_t timebase;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- mach_timebase_info(&timebase);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- uint64_t tdiff = clock * timebase.numer / timebase.denom;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const uint64_t t = mach_absolute_time();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static mach_timebase_info_data_t timebase;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (timebase.numer == 0 || timebase.denom == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ mach_timebase_info(&timebase);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const uint64_t tdiff = t * timebase.numer / timebase.denom;
</span> if ( CLOCK_MONOTONIC == clk_id ) {
tdiff = THOUSAND * ( tdiff / THOUSAND );
}
</pre><pre style='margin:0'>
</pre>