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

如何用C# Stopwatch获取函数两次调用间的总耗时?

C# Stopwatch 实现函数耗时统计与调用间隔/累计时长追踪

你的代码逻辑存在偏差——当前写法会把「上次调用启动计时后到本次调用的所有时间」(包含函数执行时间+两次调用的间隔)混在一起,既没法准确获取函数本身的运行耗时,也无法区分调用间隔和执行耗时。下面针对你的需求给出两种可行方案:

方案1:获取函数单次执行耗时 + 两次调用的间隔时长

如果需要每次调用时,同时拿到「本次函数运行耗时」和「距离上次调用结束的间隔时长」,可以这样实现:

// 类级别的字段,用于跟踪全局时间线
private readonly Stopwatch _intervalStopwatch = Stopwatch.StartNew();
// 记录上次调用结束时的累计时长,用于计算间隔
private TimeSpan _lastCallElapsed;

public double CalculateAngle(double Theta_dot, double Psi_dot)
{
    // 计算自上次调用结束到本次调用开始的间隔
    var timeSinceLastCall = _intervalStopwatch.Elapsed - _lastCallElapsed;
    Console.WriteLine($"自上次调用以来的间隔:{timeSinceLastCall.TotalSeconds}秒");

    // 单独计时本次函数执行过程
    var executionStopwatch = Stopwatch.StartNew();

    // --- 替换为你的实际计算逻辑 ---
    double angleResult = Theta_dot + Psi_dot;
    // --- 计算逻辑结束 ---

    executionStopwatch.Stop();
    var executionDuration = executionStopwatch.Elapsed.TotalSeconds;
    Console.WriteLine($"本次函数执行耗时:{executionDuration}秒");

    // 更新上次调用结束的时间点
    _lastCallElapsed = _intervalStopwatch.Elapsed;

    return angleResult;
}

方案2:获取函数单次执行耗时 + 累计执行总时长

如果需要统计该函数所有调用的总执行时间,同时保留单次耗时的记录,可采用以下写法:

// 类级别的字段,用于累计所有函数执行的总时长
private readonly Stopwatch _totalExecutionStopwatch = new Stopwatch();

public double CalculateAngle(double Theta_dot, double Psi_dot)
{
    var singleExecutionStopwatch = Stopwatch.StartNew();

    // --- 替换为你的实际计算逻辑 ---
    double angleResult = Theta_dot * Psi_dot;
    // --- 计算逻辑结束 ---

    singleExecutionStopwatch.Stop();
    var singleDuration = singleExecutionStopwatch.Elapsed.TotalSeconds;
    // 将本次执行时长累加至总时长
    _totalExecutionStopwatch.Elapsed += singleExecutionStopwatch.Elapsed;
    var totalDuration = _totalExecutionStopwatch.Elapsed.TotalSeconds;

    Console.WriteLine($"本次执行耗时:{singleDuration}秒,累计总耗时:{totalDuration}秒");

    return angleResult;
}

核心注意点

  • Stopwatch字段必须声明为类级别成员,才能在多次函数调用间保留计时状态;
  • 要区分「调用间隔」和「执行耗时」,必须分开计时,不能混用同一个Stopwatch;
  • Stopwatch.StartNew()是创建并立即启动计时的快捷方式,比手动实例化后调用Start()更简洁;
  • 如果需要将耗时信息返回给调用方,可以把函数返回值改成Tuple<double, double>(计算结果+耗时)或自定义类,同时携带多个数据。

内容的提问来源于stack exchange,提问作者Htekin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 07:25:18