我可以在c#中严格定义 "struct Timestamp "数据类型而不是 "long "吗?

问题描述 投票:0回答:1

我想在内存中存储一个时间戳(有几十亿个值).主要的操作是读到内存和读出内存,不需要DateTime-特定的方法.为了与其他服务兼容,我想使用unix的时间戳格式,以秒为单位(避免转换)。

所以,我想使用特殊的数据类型,而不是只使用 long 在我的代码中。

我发现我不能为简单的数据类型 "取别名",如 long,我完全可以在汇编外使用。

所以,我想用结构体来实现Timestamp,并在结构体中加入一个单独的 long 字段和一些方法(如ToDateTime,一些运算符重载等),因为结构体是 "非引用数据类型",而且它们会保留我的内存。

做一个结构体是个坏主意吗?

有其他选择吗? 使代码具有强烈的类型化,重新定义了 Method (long, long)Method (Timestamp, StepCount)

c# performance memory struct unix-timestamp
1个回答
5
投票

DateTime内部使用 虱子 作为值。几乎所有其他的函数调用和属性都只是一个简单的 重新解释 的Ticks值。

Ticks比秒的颗粒度要大得多,是7个数量级的。

"一个tick代表一百纳秒或一秒的千万分之一。一毫秒有一万个ticks,或者一秒有一千万个ticks。

这个属性的值代表从公历0001年1月1日午夜12:00:00开始的100纳秒的间隔数,代表MinValue。"

然而内部时钟不 确切. DateTime.Now 可能每隔30毫秒或更短的时间才更新一次。对于精确的测量,你将不得不使用的 StopWatch类 而不是。

当然,随着 亿元 的值,这真的成了一个问题,如果你有足够的内存。.NET对象大小。内存 和数组大小的limtis可能会碍事。将这些值存储在数据库中,并且只查看列表的部分内容可能会更好。在查询中使用重度过滤。


0
投票

给你一个激进的选择:实际上有一些内置的例程可以进行适当的转换,我想其中包含了一些你想要的例程。

来自 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。


出于这个原因:是的,我认为重建一个类似的结构是一个坏主意,因为它已经完成了。但我可能遗漏了一些背景。

© www.soinside.com 2019 - 2024. All rights reserved.