如何用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
相关产品推荐
相关产品推荐

