Jump to page: 1 2
Thread overview
Can I get the time "Duration" in "nsecs" acurracy?
Jul 09, 2021
rempas
Jul 09, 2021
Paul Backus
Jul 09, 2021
Ali Çehreli
Jul 10, 2021
Bruce Carneal
Jul 10, 2021
rempas
Jul 10, 2021
Ali Çehreli
Jul 09, 2021
rempas
Jul 09, 2021
jfondren
Jul 09, 2021
Bastiaan Veelo
Jul 13, 2021
dangbinghoo
July 09, 2021

I'm reading the library reference for core.time and It says that the duration is taken in "hnsecs" and I cannot understand if we can change that and choose the precision. Does anyone know if we can do that?

July 09, 2021

On Friday, 9 July 2021 at 20:43:48 UTC, rempas wrote:

>

I'm reading the library reference for core.time and It says that the duration is taken in "hnsecs" and I cannot understand if we can change that and choose the precision. Does anyone know if we can do that?

It is stored internally in "hnsecs", but you can convert it to other units using the total method [1]; for example, myDuration.total!"nsecs".

[1] https://dlang.org/phobos/core_time.html#.Duration.total

July 09, 2021
On 7/9/21 1:54 PM, Paul Backus wrote:
> On Friday, 9 July 2021 at 20:43:48 UTC, rempas wrote:
>> I'm reading the library reference for [core.time](https://dlang.org/phobos/core_time.html#Duration) and It says that the duration is taken in "hnsecs" and I cannot understand if we can change that and choose the precision. Does anyone know if we can do that?
> 
> It is stored internally in "hnsecs", but you can convert it to other units using the `total` method [1]; for example, `myDuration.total!"nsecs"`.
> 
> [1] https://dlang.org/phobos/core_time.html#.Duration.total

Yes but the resolution seems not to be better than 100 nsecs. A quick research reveals a better resolution is not possible with common hardware on at least Linux.

The following program always prints multiples of 100 on my Mint OS:

import std.stdio;
import core.thread;
import std.datetime.stopwatch;

void main() {
  auto sw = StopWatch();
  sw.start();

  foreach (_; 0..10) {
    Thread.sleep(0.nsecs);
    writefln("%,s", sw.peek.total!"nsecs");
  }
}

Ali
July 09, 2021

On Friday, 9 July 2021 at 20:54:21 UTC, Paul Backus wrote:

>

On Friday, 9 July 2021 at 20:43:48 UTC, rempas wrote:

>

I'm reading the library reference for core.time and It says that the duration is taken in "hnsecs" and I cannot understand if we can change that and choose the precision. Does anyone know if we can do that?

It is stored internally in "hnsecs", but you can convert it to other units using the total method [1]; for example, myDuration.total!"nsecs".

[1] https://dlang.org/phobos/core_time.html#.Duration.total

It doesn't work for me. I have the following code:

MonoTime start = MonoTime.currTime();
// Doing stuff
MonoTime end = MonoTime.currTime();
Duration dur = end - start;
dur = dur.total!"nsecs";

and I get the following error message:

"Error: cannot implicitly convert expression `dur.total()` of type `long` to `Duration`"

July 09, 2021

On Friday, 9 July 2021 at 21:13:02 UTC, rempas wrote:

>
Duration dur = end - start;
dur = dur.total!"nsecs";

What are you trying to do, assigning a nanosecond value to a Duration? The Duration already has that many nanoseconds in it.

>

and I get the following error message:

"Error: cannot implicitly convert expression `dur.total()` of type `long` to `Duration`"

July 09, 2021

On Friday, 9 July 2021 at 21:13:02 UTC, rempas wrote:

>

On Friday, 9 July 2021 at 20:54:21 UTC, Paul Backus wrote:

>

On Friday, 9 July 2021 at 20:43:48 UTC, rempas wrote:

>

I'm reading the library reference for core.time and It says that the duration is taken in "hnsecs" and I cannot understand if we can change that and choose the precision. Does anyone know if we can do that?

It is stored internally in "hnsecs", but you can convert it to other units using the total method [1]; for example, myDuration.total!"nsecs".

[1] https://dlang.org/phobos/core_time.html#.Duration.total

It doesn't work for me. I have the following code:

MonoTime start = MonoTime.currTime();
// Doing stuff
MonoTime end = MonoTime.currTime();
Duration dur = end - start;
dur = dur.total!"nsecs";

and I get the following error message:

"Error: cannot implicitly convert expression `dur.total()` of type `long` to `Duration`"

You cannot change the precision of Duration, it always counts in multiples of 100 nsecs. You can count how many multiples of other units fit into the same Duration using total, but it will just return a number, not a “converted” Duration.

toString will produce an easy readable string (more or less), as in https://run.dlang.io/is/baqKLG, where “hnsec” is the smallest unit. If you think hectonanosecond is a weird unit, then you are not alone, and it has been pointed out that it does not comply with SI.

— Bastiaan.

July 09, 2021

On 7/9/21 5:04 PM, Ali Çehreli wrote:

>

On 7/9/21 1:54 PM, Paul Backus wrote:

>

On Friday, 9 July 2021 at 20:43:48 UTC, rempas wrote:

>

I'm reading the library reference for core.time and It says that the duration is taken in "hnsecs" and I cannot understand if we can change that and choose the precision. Does anyone know if we can do that?

It is stored internally in "hnsecs", but you can convert it to other units using the total method [1]; for example, myDuration.total!"nsecs".

[1] https://dlang.org/phobos/core_time.html#.Duration.total

Yes but the resolution seems not to be better than 100 nsecs. A quick research reveals a better resolution is not possible with common hardware on at least Linux.

The following program always prints multiples of 100 on my Mint OS:

import std.stdio;
import core.thread;
import std.datetime.stopwatch;

void main() {
  auto sw = StopWatch();
  sw.start();

  foreach (_; 0..10) {
    Thread.sleep(0.nsecs);
    writefln("%,s", sw.peek.total!"nsecs");
  }
}

You can get better than hnsecs resolution with core.time.MonoTime, which can support whatever the OS supports.

However, Duration and SysTime are stored in hnsecs for a very specific reason -- range. Simply put, if you have a 64-bit integer, and you picked nanoseconds as the unit, you can store only 585 years of range. 10 ns gives you 5850 years, and 100 ns gives you 58k years. That should be good enough for all but the most esoteric calculations (given that a Duration is signed, this gives a range of roughly -29k years to 29k years).

Note also that hnsecs is the base unit for Windows high precision clocks, though their epoch is year 1600 instead of year 0.

-Steve

July 10, 2021
On Friday, 9 July 2021 at 21:04:42 UTC, Ali Çehreli wrote:
> On 7/9/21 1:54 PM, Paul Backus wrote:
>> [...]
>
> Yes but the resolution seems not to be better than 100 nsecs. A quick research reveals a better resolution is not possible with common hardware on at least Linux.
>
> The following program always prints multiples of 100 on my Mint OS:
>
> import std.stdio;
> import core.thread;
> import std.datetime.stopwatch;
>
> void main() {
>   auto sw = StopWatch();
>   sw.start();
>
>   foreach (_; 0..10) {
>     Thread.sleep(0.nsecs);
>     writefln("%,s", sw.peek.total!"nsecs");
>   }
> }
>
> Ali

So it's an OS thing? C++ with "std::chrono" can show me less than 1 hnsec (100 nanoseconds) accuracy.
July 10, 2021

On Saturday, 10 July 2021 at 01:11:28 UTC, Steven Schveighoffer wrote:

>

You can get better than hnsecs resolution with core.time.MonoTime, which can support whatever the OS supports.

However, Duration and SysTime are stored in hnsecs for a very specific reason -- range. Simply put, if you have a 64-bit integer, and you picked nanoseconds as the unit, you can store only 585 years of range. 10 ns gives you 5850 years, and 100 ns gives you 58k years. That should be good enough for all but the most esoteric calculations (given that a Duration is signed, this gives a range of roughly -29k years to 29k years).

Note also that hnsecs is the base unit for Windows high precision clocks, though their epoch is year 1600 instead of year 0.

Nice summary. hnsecs is a little weird but defensible given the range argument.

Down the road we might add a nanosecond timeline abstraction based on TAI with zero set to 1972 (when UTC was aligned with TAI IIUC). Range issues could be addressed by animating the long dormant cent. Any precision issues could be handled with fixed point pairs.

Doubles across the same timeline would work for casual applications.

July 10, 2021
On 7/9/21 11:28 PM, rempas wrote:

> So it's an OS thing?

Don't listen to me on this. :) A quick search yesterday made me believe you need kernel support as well. Even if so, I would imagine modern kernel on modern hardware should work.

Ali

« First   ‹ Prev
1 2