Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
等效系统时钟毫秒,单位为c++;还有C#? < >我将数据从C++ +dll传递到C应用程序,使用 dLimPult < _C#_C++_Boost - Fatal编程技术网

等效系统时钟毫秒,单位为c++;还有C#? < >我将数据从C++ +dll传递到C应用程序,使用 dLimPult <

等效系统时钟毫秒,单位为c++;还有C#? < >我将数据从C++ +dll传递到C应用程序,使用 dLimPult < ,c#,c++,boost,C#,C++,Boost,我想做的是计时数据传输时间。因此,我想在dll函数中获取系统时间(以毫秒为单位),然后在C#端再次执行相同的操作,并获取两者之间的差值以计算所花费的时间 在C++端,我发送了一个代码>长/代码>,我得到的是这样的: boost::posix_time::ptime current_date_microseconds = boost::posix_time::microsec_clock::local_time(); long millisecondStamp2 = current_date_mi

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

<>在C++端,我发送了一个<>代码>长/代码>,我得到的是这样的:

boost::posix_time::ptime current_date_microseconds = boost::posix_time::microsec_clock::local_time();
long millisecondStamp2 = current_date_microseconds.time_of_day().total_milliseconds();
63705280140098 //c#
54540098       //c++
63705225600000 // elapsed
我将
long
作为名为
timestamp
的变量发送到C,然后运行:

long milliseconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;
long elapsed = milliseconds - timestamp;
当我打印值时,它们如下所示:

boost::posix_time::ptime current_date_microseconds = boost::posix_time::microsec_clock::local_time();
long millisecondStamp2 = current_date_microseconds.time_of_day().total_milliseconds();
63705280140098 //c#
54540098       //c++
63705225600000 // elapsed
为什么C++的值和C的值如此不同? 如何以这种方式从系统时钟中获取等效值?

请忽略该评论不正确。该属性返回一个刻度计数,其单位为“一千万分之一秒”,并从“公历0001年1月1日0:00:00 UTC”开始测量此类刻度的数量。它是一个直整数值,所有位根据其在值中的重要性对总值的贡献相等

现在,只要你的结果不一致

< C++表达式>代码> CurrnDyDATE微秒。即,这是自午夜以来的总毫秒数(根据该值,您似乎在当地时间下午3点左右执行了代码)

另一方面,使用
DateTime.Now
的.NET表达式测量的是从纪元开始的毫秒数,即从0001年1月1日开始的毫秒数

这两个值根本不具有可比性。它们代表两个完全不同的时间段

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

然而

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

<> P>我觉得在.NET上使用一个更好的方法来使用“代码>系统.MyTrask.St秒表类来测量调用到C++ DLL中的全部时间,然后在C++ DLL中,使用PosixAPI来测量C++代码执行的时间并将其传递回C端。

那么C的边可以从它自己的时间中减去C++时间,以大致决定调用的总开销。(当然,确保每个值使用完全相同的单位…例如毫秒。)

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

    < LI>如果在同一调用中返回C++时间值,则In及其本身可能影响调用的总开销。
  • 一些明显的开销可能是线程调度的影响。也就是说,如果您的线程在调用过程中被抢占,那么您的部分度量将是线程被抢占的时间
  • 至少在.NET方面,也可能在C++方面,对时序的精度还有限制。
    Stopwatch
    类肯定比
    DateTime
    更精确、更可取,但是如果开销足够小,您可能无法获得有用的结果(当然,如果它那么小,那么可能足以发现它太小而无法获得有用的结果:)

据我所知,
DateTime。现在
速度相当慢,不建议用于benchamark场景。使用<代码> Stase.StutysType,StutpWistB/Cord>来测量C端的调用时间,以及Boost等价物,以测量C++端的执行时间,可能会得到更好的结果。在c#中,刻度分为两部分:1)低位40位,表示一天中时间的100ns数;2)高位24位表示从1/1/01开始的天数。看起来像C++,你只有时间而不是日期。So long date=DateTime.Now.Ticks;长毫秒=日期/10000;嗨,谢谢你回复我。这种方法打印的值与我的值完全相同<代码>长日期=DateTime.Now.Ticks;长毫秒=日期/10000;长毫秒2=DateTime.Now.Ticks/TimeSpan.tickspermillsecond
毫秒
毫秒2
是相同的。