- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个集合,其中最多 19,000 个条目,我在 foreach 语句中对其进行迭代。在 foreach 的开头,我检查一个字符串是否包含 2 个单词中的 1 个和一个 bool 值,然后我继续或执行更多操作。
foreach (SvnStatusEventArgs e in results) //results being my Collection
{
if ((e.Path.Contains("bin") ||
e.Path.Contains("obj")) && !includeBinObjFolders)
continue;
//Do a bunch of things
}
我不确定计算机是否会检查字符串中的“bin”或“obj”,然后检查 bool 值,也许它会意识到字符串包含这两个之一并不重要 '关键词”。
基本上我想我的意思是下面的运行时间会不同吗?
foreach (SvnStatusEventArgs e in results) //results being my Collection
{
if (!includeBinObjFolders &&
(e.Path.Contains("bin") ||
e.Path.Contains("obj")
)
)
continue;
//Do a bunch of things
}
出于某种原因,我听到脑后有一个声音告诉我它首先计算最右边的表达式,然后向左计算。如果是这样,第一个应该更有效率吧?我没有一种简单的方法来测试大于 ~200 个文件的集合,所以简单地使用计时器会产生非常接近的结果,我无法确认是否有一种方法更好。
坦率地说,我认为最终用户极不可能在这个集合中最多遇到超过 500 条数据,但理论上它可能是由于用户错误而发生的。
编辑 谢谢大家。我在发帖之前尝试四处搜索,但我忘记了逻辑方面的术语“短路”,所以我很难找到与我冗长的标题相关的答案。
编辑 2 事实上,我刚刚创建了一个小型控制台应用程序,其中有一个 2 个 for 循环,每个循环迭代 20,000 次。一个首先测试了 Contains,另一个首先测试了 Bool。重复这两个循环 10 次,看起来 bool 值第一次平均每 20K 次迭代花费半毫秒。首先评估的 Contains 每 20K 次迭代大约需要 3 毫秒。确实有一点不同!
最佳答案
给定的 bool 表达式将从左到右计算,而不是从右到左。确实定义了顺序;它不是任意的,也不能优化。它总是从左到右。
规范中特别提到了这一点,以便每个表达式的副作用始终按定义的顺序执行。
如果需要,您可以将 bool 变量移到前面作为优化。这可能不是一个巨大的优化,所以不要太担心,但它是一个优化。 (当然,除非您知道它总是或几乎总是解析为 true
而另一个表达式将解析为 false。)
关于c# - 在具有多个条件的单个 IF 语句中出现的顺序是否重要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19389669/
我是一名优秀的程序员,十分优秀!