使用C#获取系统时钟/时间而不使用任何对象?

时间:2014-06-26 15:32:20

标签: c# datetime time

我在C#中开发一个应用程序,需要在非常特定的时间进行许多函数调用(每秒100-1000次)。但是,这个应用程序的延迟有非常严格的规范,因此由于与垃圾收集相关的延迟增加,我使用DateTime或Timer对象是不可行的。有没有什么方法可以作为基本类型访问系统时间,而不必创建DateTime对象?

TL; DR:C#的System.currentTimeMillis()是否有类似的模块?

2 个答案:

答案 0 :(得分:5)

是什么让你认为DateTime分配对象?它是一种价值类型。不需要堆分配,因此不需要垃圾回收。 (正如TomTom所说,如果你有延迟要求,你需要一个实时操作系统等等。如果你只有'#34;低延迟要求,那&# 39;另一件事。)

您应该可以使用DateTime.NowDateTime.UtcNow而不会出现任何问题 - UtcNow速度更快,因为它不会执行任何时区转换。

例如,我只需要拨打1千万次拨打DateTime.UtcNow,然后使用Hour属性,并在笔记本电脑上拨打大约3.5秒。使用Ticks属性(不涉及多少计算)大约需要1.2秒。不使用任何属性,只需1秒钟。

所以基本上如果你每秒只执行1000次通话,那就不相关了。

答案 1 :(得分:0)

考虑不使用Windows。就像这样。甚至“不使用C#”但不使用Windows。

  

但是,这个应用程序的延迟有非常严格的规范,

有一些特殊的实时操作系统正是为此而构建的。

  

是否有类似Java的System.currentTimeMillis()f

是。但那仍然无济于事。

您可以做的最好的是高精度多媒体计时器,它像魅力一样工作,但也没有实时保证。语言不是问题 - 您选择的操作系统不适合手头的任务。

如果编程智能,GC完全不是问题。对象不是问题,在并发GC中使用并避免过度创建对象有很大帮助。你在这里戏剧化了一个问题,而不是从那里开始。

有一个内核API可以处理非常低的MS精度,可以从C#

访问

http://www.codeproject.com/Articles/98346/Microsecond-and-Millisecond-NET-Timer

真正的问题是你必须重新配置内核,以便在短暂的通知中发出中断,否则你就会受到调度程序不受如此低分辨率的影响。