【问题标题】:Testing code that could be optimised out可以优化的测试代码
【发布时间】:2011-07-29 10:47:41
【问题描述】:

我只是在尝试,我已经为我的CachedEnumerable<T> 类编写了以下测试:

[Test]
public void CanNestEnumerations()
{
    var SourceEnumerable = Enumerable.Range(0, 10).Select(i => (decimal)i);
    var CachedEnumerable = new CachedEnumerable<decimal>(SourceEnumerable);

    Assert.DoesNotThrow(() =>
        {
            foreach (var d in CachedEnumerable)
            {
                foreach (var d2 in CachedEnumerable)
                {

                }
            }
        });
}
  1. 是否会优化嵌套的 for 循环,因为它们不会 任何东西(CachedEnumerable 在循环之后从不使用)?

  2. 是否存在任何(其他?)测试代码可能被优化的情况 出去了吗?

  3. 如果是这样,我如何确保测试代码实际运行?

【问题讨论】:

    标签: tdd nunit c# unit-testing tdd nunit


    【解决方案1】:

    它不会被优化出来,因为它看起来还有更多的事情要做。代码实际上更像(改编自接受的答案here):

    using (IEnumerator<Foo> iterator = CachedEnumerable.GetEnumerator())
    {
        while (iterator.MoveNext())
        {
            var d = iterator.Current;
    
            // Other loop
        }
    }
    

    编译器不知道调用 MoveNext/Current 是否有副作用,所以它必须调用它们。如果不使用 d,那么它可能会优化分配。但它仍然必须调用 Current。另一个循环也是如此。

    所做的优化不应对您的代码产生任何逻辑影响。它只会删除没有效果或在正常情况下永远不会被调用的东西。

    【讨论】:

    • 我想我有答案,但是“所做的优化不应该对您的代码有任何逻辑影响”。不应该,还是不会?
    • @George - 什么都不是certain,这就是我说“不应该”的原因。我可以说我在 C#/.NET 的大量时间里从未遇到过优化问题。
    【解决方案2】:

    如果是这样,我如何确保测试代码实际运行?

    您可以在单元测试项目的“属性”选项卡中禁用“优化代码”。它位于“构建”选项卡中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      相关资源
      最近更新 更多