我在C#中开发一个应用程序,需要在非常特定的时间进行许多函数调用(每秒100-1000次)。但是,这个应用程序的延迟有非常严格的规范,因此由于与垃圾收集相关的延迟增加,我使用DateTime或Timer对象是不可行的。有没有什么方法可以作为基本类型访问系统时间,而不必创建DateTime对象?
TL; DR:C#的System.currentTimeMillis()是否有类似的模块?
答案 0 :(得分:5)
是什么让你认为DateTime
分配对象?它是一种价值类型。不需要堆分配,因此不需要垃圾回收。 (正如TomTom所说,如果你有硬延迟要求,你需要一个实时操作系统等等。如果你只有'#34;低延迟要求,那&# 39;另一件事。)
您应该可以使用DateTime.Now
或DateTime.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
真正的问题是你必须重新配置内核,以便在短暂的通知中发出中断,否则你就会受到调度程序不受如此低分辨率的影响。