首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在c++和C#中等效的系统时钟毫秒?

在c++和C#中等效的系统时钟毫秒?
EN

Stack Overflow用户
提问于 2019-09-28 14:16:30
回答 1查看 541关注 0票数 2

我正在使用c++ .dll将数据从DllImport传递到C#应用程序。

我想做的是时间的数据传输时间。因此,我希望在dll函数中以毫秒为单位获得系统时间,然后在C#端再次执行相同的操作,并得到两者之间的差异,以计算所需的时间。

在c++方面,我发送的long如下所示:

代码语言:javascript
复制
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#,然后运行:

代码语言:javascript
复制
long milliseconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
long elapsed = milliseconds - timestamp;

当我打印这些值时,它们看起来如下所示:

代码语言:javascript
复制
63705280140098 //c#
54540098       //c++
63705225600000 // elapsed

为什么c++值和C#值如此不同?如何才能以这种方式从系统时钟中获得等效值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-29 00:19:49

请忽略the comment that claims that .NET DateTime ticks are divided into two parts的评论是不正确的DateTime.Ticks属性返回一个滴答数,其单位为“一亿分之一秒”,它从“0001年1月1日公历”中的"0:00:00 UTC“中测量这类滴答的数量。它是一个直接的整数值,所有的位都根据它们在值中的重要性对总数的贡献是相等的。

现在,就您的结果的差异而言,…

C++表达式current_date_microseconds.time_of_day().total_milliseconds()给出了一天的总毫秒。也就是说,这是自午夜以来的总毫秒数(根据值,您似乎在当地时间下午3点左右执行了代码)。

另一方面,使用.NET的DateTime.Now表达式正在测量自纪元开始以来的毫秒数,即自0001年1月1日起。

这两个数值根本无法比较。它们代表两个完全不同的时间段。

理论上,您可以通过使用.NET端的DateTime.Now.TimeOfDay.TotalMilliseconds来解决这个问题。这将使你更接近你所期望的价值。

然而,…

我不清楚您所使用的C++ POSIX API是否会使用与.NET API完全相同的时钟引用。此外,即使是这样,API本身也有一些开销,以及线程调度的扰动,这可能会给计算带来错误。

在我看来,一个更好的方法是让.NET端的您使用System.Diagnostics.Stopwatch类来度量调用C++ DLL所需的全部时间,然后在C++ DLL中使用POSIX来度量C++代码执行并将其传递回C#端所需的时间。

然后,C#端可以从自己的时间中减去C++时间,从而大致确定调用的总开销是多少。(当然,确保对每个值…使用完全相同的单位例如毫秒)

即便如此,重要的是要记住:

  • 如果在同一个调用中返回C++时间值,这本身就会影响调用的总开销。
  • 的一些明显开销可能是线程调度效果。也就是说,如果您的线程在调用过程中被抢占,那么您的部分度量将是线程在pre-empted.
  • At侧最小的时间,并且可能在C++端也是如此,对计时的精度仍然有限制。Stopwatch类肯定比DateTime更精确和更好,但是如果开销足够小,您可能得不到有用的结果(当然,如果它那么小,那么它可能就足够好发现它太小,无法获得有用的结果:)。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58147182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档