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

Equivalent system clock milliseconds in c++ and C#?

本文关键字:时钟 系统 C++      更新时间:2023-10-16

我正在使用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更精确、更可取,但如果开销足够小,你可能无法得到有用的结果(但当然,如果它那么小,那么它可能足以发现它太小而无法获得有用的结果:)(。