在c#中不使用任何对象获取系统时钟/时间
本文关键字:系统 获取 时钟 时间 对象 任何 | 更新日期: 2023-09-27 18:10:27
我正在用c#开发一个应用程序,它需要在非常特定的时间进行许多函数调用(每秒100-1000次)。然而,这个应用程序的延迟有非常严格的规范,因此由于与垃圾收集相关的延迟增加,我不可能使用DateTime或Timer对象。是否有某种方法可以将系统时间作为基本类型访问,而不必创建DateTime对象?
TL;DR: c#中是否有类似Java的System.currentTimeMillis() ?
是什么让你认为DateTime
分配对象?它是一个值类型。不需要堆分配,因此不需要垃圾收集。(正如TomTom所说,如果你有硬延迟要求,你就需要一个实时操作系统等。如果您只是有"低"延迟需求,那就是另一回事了。
您应该能够使用DateTime.Now
或DateTime.UtcNow
没有任何问题- UtcNow
更快,因为它不执行任何时区转换。
作为一个例子,我只是对DateTime.UtcNow
进行了1亿次调用,然后使用Hour
属性,在我的笔记本电脑上,这大约需要3.5秒。使用Ticks
属性(不涉及太多计算)大约需要1.2秒。不使用任何属性,只需要1秒。
所以基本上如果你每秒只执行1000个调用,它将是无关的。
考虑不使用windows。就这么简单。甚至不是"不使用c#",而是不使用windows。
然而,这个应用程序的延迟有非常严格的规格,
有一些特殊的实时操作系统正是为此而构建的。
是否有类似于Java的System.currentTimeMillis() f
是的。但这仍然无济于事。
你能做的最好的是高精度的多媒体计时器,它工作起来很有魅力,但也没有实时的保证。语言不是问题——你选择的操作系统不适合手头的任务。
如果编程聪明,GC完全不是问题。对象不是问题,使用并发GC和避免过多创建对象会有很大帮助。你把一个根本不存在的问题夸大了。
有一个内核API可以处理非常低的MS精度,可以从c#
访问http://www.codeproject.com/Articles/98346/Microsecond-and-Millisecond-NET-Timer真正的问题是,您必须重新配置内核,以便在短时间内发出中断通知,否则您将受到调度程序的摆布,因为调度程序没有这么低的分辨率。