1 回答

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超3個(gè)贊
請(qǐng)忽略聲稱 .NET刻度線分為兩部分的評(píng)論DateTime
。這個(gè)評(píng)論是不正確的。該屬性返回單位為“百萬分之一秒”DateTime.Ticks
的刻度計(jì)數(shù),并測(cè)量從“公歷 0001 年 1 月 1 日 0:00:00 UTC”開始的刻度數(shù)。它是一個(gè)直接整數(shù)值,所有位根據(jù)其在該值中的重要性對(duì)總數(shù)做出同等貢獻(xiàn)。
現(xiàn)在,就結(jié)果的差異而言……
C++ 表達(dá)式為您提供當(dāng)天的current_date_microseconds.time_of_day().total_milliseconds()
總毫秒數(shù)。即,這是自午夜以來的總毫秒數(shù)(根據(jù)該值,您似乎在當(dāng)?shù)貢r(shí)間下午 3 點(diǎn)左右執(zhí)行了代碼)。
另一方面,.NET 表達(dá)式使用的DateTime.Now
是測(cè)量自紀(jì)元開始(即自 0001 年 1 月 1 日以來)的毫秒數(shù)。
這兩個(gè)值根本沒有可比性。它們代表了兩個(gè)完全不同的時(shí)期。
理論上,您可以通過在 .NET 端使用DateTime.Now.TimeOfDay.TotalMilliseconds
.?這將使您更接近您期望的值。
然而…
我不清楚是否能保證您使用的 C++ POSIX API 將使用與 .NET API 完全相同的時(shí)鐘參考。此外,即使是這樣,API 本身也會(huì)產(chǎn)生一些開銷,并且線程調(diào)度擾動(dòng)可能會(huì)在計(jì)算中引入錯(cuò)誤。
在我看來,更好的方法是在 .NET 端使用類System.Diagnostics.Stopwatch
來測(cè)量調(diào)用 C++ DLL 所花費(fèi)的整個(gè)時(shí)間,然后在 C++ DLL 中,使用 POSIX API 來測(cè)量C++ 代碼執(zhí)行并將其傳回 C# 端所需的時(shí)間。
然后,C# 端只需從自己的時(shí)間中減去 C++ 時(shí)間,即可大致確定調(diào)用的總開銷是多少。(當(dāng)然,確保每個(gè)值使用完全相同的單位……例如毫秒。)
即便如此,重要的是要記住:
如果您在同一調(diào)用中返回 C++ 時(shí)間值,則其本身可能會(huì)影響調(diào)用的總開銷。
一些明顯的開銷可能是線程調(diào)度的影響。即,如果您的線程在調(diào)用期間被搶占,那么您的測(cè)量的一部分將是線程被搶占的時(shí)間。
至少在 .NET 方面,可能在 C++ 方面,計(jì)時(shí)的精度仍然存在限制。該類
Stopwatch
肯定比 更精確和更可取DateTime
,但是如果開銷足夠小,您可能不會(huì)獲得有用的結(jié)果(但是當(dāng)然,如果它那么小,那么可能足以發(fā)現(xiàn)它太小而無法獲得有用的結(jié)果: ))。
- 1 回答
- 0 關(guān)注
- 179 瀏覽
添加回答
舉報(bào)