C++ 和 C# 中的等效系统时钟毫秒?
Equivalent system clock milliseconds in c++ and C#?
我正在使用DllImport
将数据从c ++.dll传递到C#应用程序。
我想做的是计时数据传输时间。所以我想在dll函数中获取以毫秒为单位的系统时间,然后在C#端再次执行相同的操作,并获取两者之间的差值以计算所花费的时间。
在 c++ 方面,我发送了一个long
,我得到的是这样的:
boost::posix_time::ptime current_date_microseconds = boost::posix_time::microsec_clock::local_time();
long millisecondStamp2 = current_date_microseconds.time_of_day().total_milliseconds();
我将long
作为名为timestamp
的变量发送到 C#,然后运行:
long milliseconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
long elapsed = milliseconds - timestamp;
当我打印值时,它们看起来像这样:
63705280140098 //c#
54540098 //c++
63705225600000 // elapsed
为什么 C++ 值和 C# 值如此不同? 如何以这种方式从系统时钟获取等效值?
请忽略声称 .NETDateTime
刻度分为两部分的评论。这种评论是不正确的。DateTime.Ticks
属性返回一个刻度计数,其单位为"千万分之一秒">,并测量从"公历 0001 年 1 月 1 日 0:00:00 UTC"开始的此类刻度数。它是一个直接整数值,所有位根据它们在总值中的重要性等分贡献。
现在,就结果的差异而言...
C++表达式current_date_microseconds.time_of_day().total_milliseconds()
为您提供当天的总毫秒数。 即,这是自午夜以来的总毫秒数(根据该值,您似乎在当地时间下午 3 点左右执行了代码(。
另一方面,使用DateTime.Now
的 .NET 表达式测量自纪元开始(即自 0001 年 1 月 1 日以来(以来的毫秒数。
这两个值根本没有可比性。它们代表两个完全不同的时间段。
理论上,您可以通过改用 .NET 端的DateTime.Now.TimeOfDay.TotalMilliseconds
来解决此问题。这将使您更接近预期的值。
然而。。。
我不清楚是否保证您使用的C++ POSIX API将使用与.NET API完全相同的时钟引用。此外,即使是这样,API 本身也会有一些开销,以及线程调度扰动,这可能会在计算中引入错误。
在我看来,更好的方法是在 .NET 端使用System.Diagnostics.Stopwatch
类来测量调用C++ DLL 所花费的全部时间,然后在C++ DLL 中使用 POSIX API 测量C++代码执行所需的时间并将其传递回 C# 端。
然后,C# 端可以从自己的时间中减去C++时间,大致确定调用的总开销是多少。(当然,确保为每个值使用完全相同的单位......例如毫秒。
即便如此,重要的是要记住:
- 如果在同一调用中返回C++时间值,则其本身可能会影响调用的总开销。
- 一些明显的开销可能是线程调度效应。 即,如果您的线程在调用期间被抢占,那么您测量的一部分将是线程被抢占的时间。
- 至少在 .NET 端,可能还有C++端,计时精度仍然存在限制。
Stopwatch
类肯定比DateTime
更精确、更可取,但如果开销足够小,你可能无法得到有用的结果(但当然,如果它那么小,那么它可能足以发现它太小而无法获得有用的结果:)(。
- 在C++/Linux中设置单调时钟的一些技巧
- C++,系统无法执行指定的程序
- 在UNIX系统中使用DIR查找文件的字节大小
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 如何使用 CTIME/Chrono Libarey 将开始时间与系统时钟进行比较
- C++ 和 C# 中的等效系统时钟毫秒?
- 稳定时钟系统范围是否稳定?
- Visual C 文本游戏自定义时钟系统
- 在没有单调时钟的系统上,是否不可能实现一致性
- c ++如何使运行时间显示在cmd上?作为运行时钟,需要更改系统("clear")?
- 不使用系统时钟进行时间测量
- 可视化 如何在C++中以微秒为单位获取系统时钟
- 使用设置系统时间调整重置时钟速率,而无需使用时间服务器
- 系统时钟和辅助时钟之间的差异
- 如何更换或重新油漆系统托盘时钟
- c和c++11中系统时钟的性能
- 每N秒做一些与Windows系统时钟同步的事情
- 时钟()在<ctime>访问系统时钟时如何工作?
- boost::deadline_timer在修改系统时钟时可能会失败