Skip to content

Tracking Issue: Duration::{as_nanos, as_micros, as_millis} #50202

Description

@fintelia

Duration has historically lacked a way to get the actual number of nanoseconds it contained as a normal Rust type because u64 was of insufficient range, and f64 of insufficient precision. The u128 type solves both issues, so I propose adding an as_nanos function to expose the capability.

CC: #50167

Activity

  1. added
    T-libs-api[DEPRECATED; DO NOT USE]
    C-tracking-issueCategory: An issue tracking the progress of sth. like the implementation of an RFC
    on Apr 26, 2018
  2. changed the title [-]Duration should have an as_nanos function[/-] [+]Tracking Issue: Duration::as_nanos[/+] on May 27, 2018
  3. added
    B-unstableBlocker: Implemented in the nightly compiler and unstable.
    on Jun 2, 2018
  4. changed the title [-]Tracking Issue: Duration::as_nanos[/-] [+]Tracking Issue: Duration::{as_nanos, as_micros, as_millis}[/+] on Jun 2, 2018
  5. gbutler69 commented on Jul 4, 2018

    @gbutler69

    I still don't understand why Duration is not allowed to be negative. It bugs me that the SystemTime difference returns a Result<Duration,Error> and returns and error if the time from is after the time to. To me, it should just return a negative Duration (Yes, the System Clock can go backwards). I find it odd that Duration does not support a negative amount.

  6. lnicola commented on Jul 4, 2018

    @lnicola
    Member

    @gbutler69 I think it's about the way you think of Duration. If it's a span of time (like described in the documentation) or an interval, then it must be positive. If it's the distance between two time points, it's negative.

    You're probably thinking of a distance instead of an interval. That's not necessarily a bad thing, but it's different from what the type is today, and it will never change due to compatibility concerns.

  7. gbutler69 commented on Jul 4, 2018

    @gbutler69

    If it's a span of time (like described in the documentation) or an interval, then it must be positive. If it's the distance between two time points, it's negative.

    Here is what I take issue with:

    let t1 = std:time:SystemTime.now();
    // ....long running computation happening...
    // System Clock Time changed back 5 hours (because it was wrong to begin with) outside the program
    // ....long running computation completed...
    let t2 = std:time:SystemTime.now();
    
    let clock_time_between_events = t2.duration_since( t1 ); // returns an error instead of negative duration, so I must do...
    let ( clock_time_between_events, neg_duration ) = match ( clock_time_between_events ) {
        Some(duration) => ( duration, false )
        _ => ( t1.duration_since( t2 ).unwrap(), true )
    }

    And....DING! DING! DING! ....you know what, now that I've typed out that code, I can't think of any justifiable reason I would actually want that, so, once again, the thoughtfulness of Rust shows itself. You and the designers of Duration were correct. Negative Duration doesn't make sense (even though it feels like it should).

  8. lnicola commented on Jul 4, 2018

    @lnicola
    Member

    You can use https://doc.rust-lang.org/std/time/struct.Instant.html if you want to measure a duration.

  9. gbutler69 commented on Jul 4, 2018

    @gbutler69

    You can use https://doc.rust-lang.org/std/time/struct.Instant.html if you want to measure a duration.

    Yes, I'm aware. I guess I think there should be another thing called ClockTimeDifference (that can be neg/pos) and there should be methods on SystemTime that don't return Result<Duration,Error>, but, instead return ClockTimeDifference. It could be as simple as:

    struct ClockTimeDifference {
       duration : Duration,
       is_negative : bool
    }
  10. lnicola commented on Jul 4, 2018

    @lnicola
    Member

    It can, but the return type of duration_since will never change, so it's up to you (or a crate) to implement that.

  11. fintelia commented on Jul 4, 2018

    @fintelia
    ContributorAuthor

    @gbutler69 @lnicola This is the tracking issue for a feature that adds several specific methods to Duration, not a place to debate general concerns about the Duration type. Your discussion is probably better suited for the internals.rust-lang.org site.

  12. NatTuck commented on Jul 6, 2018

    @NatTuck

    Why can't as_millis return an i64?

  13. sfackler commented on Jul 7, 2018

    @sfackler
    Member

    @NatTuck large durations won't fit into that type.

  14. rivertam commented on Nov 13, 2018

    @rivertam
    Contributor

    Pardon my ignorance, but why is this unstable? For my usecase, I probably don't need more than a u32, and I really only need millis (though the code I'm porting happens to use microseconds). I'd rather have a u128, but I'm just not sure what to do here for my code which I'm trying to keep as close to fully stable as possible (I want it to be as portable and safe as I can make it).

    I know (I think?) I can use d.as_secs() * 1_000_000u64 + d.subsec_micros() as u64, but I'd rather not lose the precision and I think I can always use u128 for all my platforms.

  15. 4 remaining items

  16. added
    disposition-mergeThis issue / PR is in PFCP or FCP with a disposition to merge it.
    on Nov 13, 2018
  17. SimonSapin commented on Nov 14, 2018

    @SimonSapin
    Contributor

    I couldn’t find all the details in this issue, grepping through the code shows that this tracking issue is for:

        pub fn as_millis(&self) -> u128 {…}
        pub fn as_micros(&self) -> u128 {…}
        pub fn as_nanos(&self) -> u128 {…}
  18. lnicola commented on Nov 14, 2018

    @lnicola
    Member

    This may be a stupid question, but is u128 available on all platforms that Rust supports?

  19. added
    final-comment-periodIn the final comment period and will be merged soon unless new substantive objections are raised.
    and removed
    proposed-final-comment-periodProposed to merge/close by relevant subteam, see T-<team> label. Will enter FCP once signed off.
    on Nov 14, 2018
  20. rfcbot commented on Nov 14, 2018

    @rfcbot

    🔔 This is now entering its final comment period, as per the review above. 🔔

  21. sfackler commented on Nov 14, 2018

    @sfackler
    Member

    @lnicola Yep, it should be available on all platforms.

  22. added and removed
    final-comment-periodIn the final comment period and will be merged soon unless new substantive objections are raised.
    on Nov 24, 2018
  23. rfcbot commented on Nov 24, 2018

    @rfcbot

    The final comment period, with a disposition to merge, as per the review above, is now complete.

  24. sunjay commented on Dec 24, 2018

    @sunjay
    Contributor

    Now that final comment period has ended, can these methods be stabilized?

  25. SimonSapin commented on Dec 25, 2018

    @SimonSapin
    Contributor

    Yes, the next step is a stabilization PR.

  26. sunjay commented on Dec 25, 2018

    @sunjay
    Contributor

    Yes, the next step is a stabilization PR.

    Awesome! I've made a PR for stabilization here: #57124

    Please let me know if it needs any adjustments. I can't wait for this to land! 🎉

  27. added a commit that references this issue on Dec 26, 2018
    79bbce4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    B-unstableBlocker: Implemented in the nightly compiler and unstable.C-tracking-issueCategory: An issue tracking the progress of sth. like the implementation of an RFCT-libs-api[DEPRECATED; DO NOT USE]disposition-mergeThis issue / PR is in PFCP or FCP with a disposition to merge it.finished-final-comment-periodThe final comment period is finished for this PR / Issue.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions