我想在内存中存储一个时间戳(有几十亿个值).主要的操作是读到内存和读出内存,不需要DateTime-特定的方法.为了与其他服务兼容,我想使用unix的时间戳格式,以秒为单位(避免转换)。
所以,我想使用特殊的数据类型,而不是只使用 long
在我的代码中。
我发现我不能为简单的数据类型 "取别名",如 long
,我完全可以在汇编外使用。
所以,我想用结构体来实现Timestamp,并在结构体中加入一个单独的 long
字段和一些方法(如ToDateTime,一些运算符重载等),因为结构体是 "非引用数据类型",而且它们会保留我的内存。
做一个结构体是个坏主意吗?
有其他选择吗? 使代码具有强烈的类型化,重新定义了 Method (long, long)
到 Method (Timestamp, StepCount)
DateTime内部使用 虱子 作为值。几乎所有其他的函数调用和属性都只是一个简单的 重新解释 的Ticks值。
Ticks比秒的颗粒度要大得多,是7个数量级的。
"一个tick代表一百纳秒或一秒的千万分之一。一毫秒有一万个ticks,或者一秒有一千万个ticks。
这个属性的值代表从公历0001年1月1日午夜12:00:00开始的100纳秒的间隔数,代表MinValue。"
然而内部时钟不 确切. DateTime.Now
可能每隔30毫秒或更短的时间才更新一次。对于精确的测量,你将不得不使用的 StopWatch类 而不是。
当然,随着 亿元 的值,这真的成了一个问题,如果你有足够的内存。.NET对象大小。内存 和数组大小的limtis可能会碍事。将这些值存储在数据库中,并且只查看列表的部分内容可能会更好。在查询中使用重度过滤。
给你一个激进的选择:实际上有一些内置的例程可以进行适当的转换,我想其中包含了一些你想要的例程。
来自 msdn。
using System;
public class Example
{
public static void Main()
{
DateTimeOffset dto = new DateTimeOffset(1970, 1, 1, 0, 0, 0, TimeSpan.Zero);
Console.WriteLine("{0} --> Unix Seconds: {1}", dto, dto.ToUnixTimeSeconds());
dto = new DateTimeOffset(1969, 12, 31, 23, 59, 0, TimeSpan.Zero);
Console.WriteLine("{0} --> Unix Seconds: {1}", dto, dto.ToUnixTimeSeconds());
dto = new DateTimeOffset(1970, 1, 1, 0, 1, 0, TimeSpan.Zero);
Console.WriteLine("{0} --> Unix Seconds: {1}", dto, dto.ToUnixTimeSeconds());
}
}
// The example displays the following output:
// 1/1/1970 12:00:00 AM +00:00 --> Unix Seconds: 0
// 12/31/1969 11:59:00 PM +00:00 --> Unix Seconds: -60
// 1/1/1970 12:01:00 AM +00:00 --> Unix Seconds: 60
或者对应的:
public static DateTimeOffset FromUnixTimeSeconds (long seconds);
https:/docs.microsoft.comen-usdotnetapisystem.datetimeoffset.tounixtimeseconds?view=netcore-3.1。
出于这个原因:是的,我认为重建一个类似的结构是一个坏主意,因为它已经完成了。但我可能遗漏了一些背景。