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

将对象设置为已有状态的负面计算影响及优化对比分析

直接赋值 vs 先检查再赋值的性能开销对比

场景一:Stopwatch启动操作

先看两种实现代码:

public void StopWatchBtn_Click(...)
{
    stopwatch.Start();
}

public void StopWatchBtnWithCheck_Click(...)
{
    if (!stopwatch.IsRunning)
        stopwatch.Start();
}

这里要注意,.NET自带的Stopwatch.Start()方法内部已经做了状态校验——重复调用时不会执行任何无效操作。这种情况下,额外加一层if判断纯粹是多此一举,反而会增加一次条件分支的计算开销,对性能没有任何帮助。

场景二:TextBox/Tag赋值操作

这个场景的性能差异会更显著,先看代码:

public void SetTextBox(string newStr)
{
    // 无论内容是否一致,都会触发TextBox的内部更新与事件
    someTextBox.Text = newStr;
}

public void SetTextBoxWithCheck(string newStr)
{
    if (!someTextBox.Text.Equals(newStr))
        someTextBox.Text = newStr;
}

如果直接给TextBox.Text赋值相同的字符串,会触发一连串的后续操作:比如文本内容的合法性校验、控件布局的重新计算、TextChanged事件的触发,甚至会引发UI线程的重绘。这些操作的开销远大于一次字符串相等性判断的成本。

同理,给控件的Tag属性赋值相同对象时,虽然没有UI重绘的开销,但部分UI框架仍会触发属性变更通知事件,提前做相等性检查就能避免这些无效的事件触发与内部逻辑执行。

总结

  • 如果目标方法或属性内部已经自带了重复操作的拦截逻辑(比如Stopwatch.Start()),额外的前置检查属于冗余操作,会增加无谓的计算开销。
  • 如果赋值操作会触发复杂的后续逻辑(比如UI控件的属性变更、事件通知),先做相等性检查再执行赋值,能有效减少无效计算,整体性能更优。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 14:37:38