search
HomeBackend DevelopmentGolangMonotonic clock processing of time package

Monotonic clock processing of time package

Aug 04, 2023 pm 05:45 PM
go languagetime

Today we are mainly going to take a look at the time application method of golang time package.

When it comes to computer processing clocks, there are two main ways:

  • Wall clock (wall time)
  • Monotonic clocks

The general rule between the two is that "wall time" is used for telling time, while "monotonic clock" is used forMeasure time; In addition, there are other clock processing methods.

If you still don’t understand the concepts of the above two clocks, then I recommend that you visit: Do you really understand the computer time? [1]This article details the origins of these two clocks.

Before reading the following, I will assume that you already know what a Wall Clock and a Monotone Clock are.

I will next look at an introduction to time.Time (translated by machine):

Time represents a time instant with nanosecond precision.

Programs that use times should generally store and pass them as values ​​rather than pointers. In other words, the type of time variables and structure fields should be time.Time, not *time.Time.

A Time value can be used by multiple goroutines at the same time, except GobDecode, UnmarshalBinary, The UnmarshalJSON and UnmarshalText methods are not concurrency safe.

Time instants can be compared using the Before, After, and Equal methods. The Sub method subtracts two instants, producing a duration. The Add method adds a duration to a time, producing a time.

The zero value of type Time is January 1, Year 1, 00:00:00.000000000 UTC. Since this time is unlikely to occur in practice, the IsZero method provides a simple way to detect times that have not been explicitly initialized.

Each Time is associated with a Location, which is referenced when calculating the representation of the time. For example in the Format, Hour and Year methods. The Local, UTC, and In methods return the time at a specific location. Changing the position in this way only changes the presentation; it does not change the moment of representation and therefore does not affect the calculations described in the previous paragraph.

The time value saved by the GobEncode, MarshalBinary, MarshalJSON, and MarshalText methods represents the offset at which the Time.Location is stored, but not the location name. Therefore, they lose information about daylight saving time.

In addition to the required "wall clock" reading, the time can also contain an optional reading of the current process's monotonic clock to provide additional comparison or subtraction precision. See the "Monotonic Clocks" section in the package documentation for details.

Note that the Go == operator compares not only time instants, but also positions and monotonic clock readings. Therefore, time values ​​should not be used as map or database keys without first ensuring that the same position has been set for all values, this can be achieved by using UTC or native methods, and that the monotonic clock reading has been stripped out setting t = t.Round(0). In general, prefer t.Equal(u) to t == u because t.Equal uses the most accurate comparison available and correctly handles the case where only one parameter has a monotonic clock reading.

This is the official introduction of time.TIme. Let's take a look at what the structure of Time looks like:

type Time struct {
 wall uint64
 ext  int64

 loc *Location
}

wall Its highest bit contains a 1-bit flag. Represents hasMonotonic, followed by 33 bits to track seconds; and finally 30 bits to track nanoseconds in the range [0, 999999999].

If the hasMonotonic bit is 0, the 33-bit field is zero, and ext stores the full signed 64-bit wall## since January 1, 2020 #Seconds.

如果该hasMonotonic位为1,则33位字段存储自1885年1月1日以来的无符号的wall秒数,而ext保留有符号的64位单调时钟读数,距离进程开始的时间为纳秒。这是大多数代码中通常发生的情况。

我们来通过 time.now() 函数来查看其中的区别:

// Now returns the current local time.
func Now() Time {
 sec, nsec, mono := now() // 返回对应的秒数,纳秒数,单调时钟数
 mono -= startNano
 sec += unixToInternal - minWall
 if uint64(sec)>>33 != 0 { // 判断如果秒数右移33位后大于0,说明不能采用单调时钟。
  return Time{uint64(nsec), sec + minWall, Local} // 按照 `wall` 时钟返回
 }
  
  // 返回 `wall` 时钟和 `monotonic` 时钟信息
 return Time{hasMonotonic | uint64(sec)<<nsecShift | uint64(nsec), mono, Local}
}

通过这个例子我们可以看到在time包中对于时间差的计算基本都会采用单调时钟墙上时钟的兼容。

  • func (t Time) After(u Time) bool {...}
  • func (t Time) Before(u Time) bool {...}
  • func (t Time) Equal(u Time) bool {...}
  • func (t Time) Add(d Duration) Time {...}
  • func (t Time) Sub(u Time) Duration {...}
  • func Since(t Time) Duration {...}
  • func Until(t Time) Duration {...}

对于增加修改时间计算会清除单调时钟,因为后面调用的是 unixTime 函数:

func unixTime(sec int64, nsec int32) Time {
 return Time{uint64(nsec), sec + unixToInternal, Local}
}

不会计算单调时钟的秒数,如下:

  • func Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time {...}
  • func Unix(sec int64, nsec int64) Time {...}
  • func UnixMilli(sec int64, nsec int64) Time {...}
  • func UnixMicro(sec int64, nsec int64) Time {...}
  • func (t Time) AddDate(years int, months int, days int) Time { ...}

I hope that after reading these concepts and knowledge, you will become more proficient in using the time package.

The above is the detailed content of Monotonic clock processing of time package. For more information, please follow other related articles on the PHP Chinese website!

Statement
This article is reproduced at:Golang菜鸟. If there is any infringement, please contact admin@php.cn delete
C   and Golang: When Performance is CrucialC and Golang: When Performance is CrucialApr 13, 2025 am 12:11 AM

C is more suitable for scenarios where direct control of hardware resources and high performance optimization is required, while Golang is more suitable for scenarios where rapid development and high concurrency processing are required. 1.C's advantage lies in its close to hardware characteristics and high optimization capabilities, which are suitable for high-performance needs such as game development. 2.Golang's advantage lies in its concise syntax and natural concurrency support, which is suitable for high concurrency service development.

Golang in Action: Real-World Examples and ApplicationsGolang in Action: Real-World Examples and ApplicationsApr 12, 2025 am 12:11 AM

Golang excels in practical applications and is known for its simplicity, efficiency and concurrency. 1) Concurrent programming is implemented through Goroutines and Channels, 2) Flexible code is written using interfaces and polymorphisms, 3) Simplify network programming with net/http packages, 4) Build efficient concurrent crawlers, 5) Debugging and optimizing through tools and best practices.

Golang: The Go Programming Language ExplainedGolang: The Go Programming Language ExplainedApr 10, 2025 am 11:18 AM

The core features of Go include garbage collection, static linking and concurrency support. 1. The concurrency model of Go language realizes efficient concurrent programming through goroutine and channel. 2. Interfaces and polymorphisms are implemented through interface methods, so that different types can be processed in a unified manner. 3. The basic usage demonstrates the efficiency of function definition and call. 4. In advanced usage, slices provide powerful functions of dynamic resizing. 5. Common errors such as race conditions can be detected and resolved through getest-race. 6. Performance optimization Reuse objects through sync.Pool to reduce garbage collection pressure.

Golang's Purpose: Building Efficient and Scalable SystemsGolang's Purpose: Building Efficient and Scalable SystemsApr 09, 2025 pm 05:17 PM

Go language performs well in building efficient and scalable systems. Its advantages include: 1. High performance: compiled into machine code, fast running speed; 2. Concurrent programming: simplify multitasking through goroutines and channels; 3. Simplicity: concise syntax, reducing learning and maintenance costs; 4. Cross-platform: supports cross-platform compilation, easy deployment.

Why do the results of ORDER BY statements in SQL sorting sometimes seem random?Why do the results of ORDER BY statements in SQL sorting sometimes seem random?Apr 02, 2025 pm 05:24 PM

Confused about the sorting of SQL query results. In the process of learning SQL, you often encounter some confusing problems. Recently, the author is reading "MICK-SQL Basics"...

Is technology stack convergence just a process of technology stack selection?Is technology stack convergence just a process of technology stack selection?Apr 02, 2025 pm 05:21 PM

The relationship between technology stack convergence and technology selection In software development, the selection and management of technology stacks are a very critical issue. Recently, some readers have proposed...

How to use reflection comparison and handle the differences between three structures in Go?How to use reflection comparison and handle the differences between three structures in Go?Apr 02, 2025 pm 05:15 PM

How to compare and handle three structures in Go language. In Go programming, it is sometimes necessary to compare the differences between two structures and apply these differences to the...

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
4 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

SublimeText3 Linux new version

SublimeText3 Linux new version

SublimeText3 Linux latest version

DVWA

DVWA

Damn Vulnerable Web App (DVWA) is a PHP/MySQL web application that is very vulnerable. Its main goals are to be an aid for security professionals to test their skills and tools in a legal environment, to help web developers better understand the process of securing web applications, and to help teachers/students teach/learn in a classroom environment Web application security. The goal of DVWA is to practice some of the most common web vulnerabilities through a simple and straightforward interface, with varying degrees of difficulty. Please note that this software

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.