将对象设置为已有状态的负面计算影响及优化对比分析
直接赋值 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
相关产品推荐
相关产品推荐

