我正在使用c++ .dll将数据从DllImport传递到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#值如此不同?如何才能以这种方式从系统时钟中获得等效值?
发布于 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++时间,从而大致确定调用的总开销是多少。(当然,确保对每个值…使用完全相同的单位例如毫秒)
即便如此,重要的是要记住:
Stopwatch类肯定比DateTime更精确和更好,但是如果开销足够小,您可能得不到有用的结果(当然,如果它那么小,那么它可能就足够好发现它太小,无法获得有用的结果:)。https://stackoverflow.com/questions/58147182
复制相似问题