You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 13:35:22