C++与C#跨DLL回调的函数耗时测算问题咨询
问题解答
1. 当前实现是否正确?
不正确。核心问题是C++与C#使用的时间基准完全不同:
- C++
std::chrono::system_clock的纪元起始点是1970年1月1日(Unix时间戳) - C#
DateTime.Now的计算基准是0001年1月1日
两者起始时间差了近2000年,直接用两边的毫秒数求差得到的是跨纪元的时间差,和函数实际耗时毫无关系,你看到的63802044110874就是这个无效差值。
另外,即使统一纪元,用系统时间测算耗时也不严谨——系统时间可能被NTP同步、用户手动修改等因素干扰,导致结果失真。
2. 正确的耗时测算方案
方案一:高精度单调计时器(推荐)
使用不受系统时间影响的单调计时器,直接记录函数执行的相对时间差:
- C++端:用
std::chrono::steady_clock记录起止时间,计算耗时后传给C##include <chrono> // 记录开始时间 auto start = std::chrono::steady_clock::now(); // 执行目标函数 target_function(); // 计算耗时(毫秒) auto elapsed_ms = std::chrono::duration_cast<std::chrono::milliseconds>( std::chrono::steady_clock::now() - start ).count(); // 通过回调传递耗时到C# callback(elapsed_ms); - C#端直接接收该毫秒数即可,无需额外计算,这就是函数的实际耗时。
方案二:统一纪元时间(不推荐)
如果必须使用纪元时间,需强制两边基于同一基准(如Unix时间戳):
- C++端获取Unix时间戳(毫秒):
auto now = std::chrono::system_clock::now(); long unix_ms = std::chrono::duration_cast<std::chrono::milliseconds>( now.time_since_epoch() ).count(); - C#端转换为同一基准的时间戳再计算差值:
// 获取当前Unix时间戳(毫秒) long unixMs = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds; // 计算耗时(注意确保C++传的是结束时间,此处为结束减开始) long elapsedMs = cppUnixMs - unixMs;
补充:现有无效差值的可读转换(无实际意义)
若只是想把当前得到的63802044110874转换为可读格式,可通过TimeSpan处理,但结果仅为两个时间基准的差值,和函数耗时无关:
long diffMs = 63802044110874; TimeSpan span = TimeSpan.FromMilliseconds(diffMs); Console.WriteLine($"时间差:{span.Days}天 {span.Hours}小时 {span.Minutes}分钟 {span.Seconds}秒 {span.Milliseconds}毫秒");
内容的提问来源于stack exchange,提问作者anti
相关产品推荐
相关产品推荐

