【问题标题】:C# stopwatch bug?C#秒表错误?
【发布时间】:2015-12-06 02:05:55
【问题描述】:

当我创建一个包含方法的数组时,stopwatch.elapsedMilliseconds 总是返回 0。

例子:

int[] methods = {method1(), method2()};

Stopwatch sw = new Stopwatch();

sw.Start();
int val = methods[1];
sw.Stop();

Console.WriteLine("It took {0} ms", sw.ElapsedMilliseconds);
// Output: "It took 0 ms"

当我直接调用该方法时,秒表可以正常工作:

Stopwatch sw = new Stopwatch();

sw.Start();
method1();
sw.Stop();

Console.WriteLine("It took {0} ms", sw.ElapsedMilliseconds);
// Output: "It took x ms"

我做错了什么?

编辑: 实际主代码:

 static void Main(string[] args)
        {
            Stopwatch t = new Stopwatch();
            Func<int>[] problems = new Func<int>[] { problem5, problem6 };


            for (int i = 0; i < problems.Length; i++)
            {
                t.Restart();
                Console.WriteLine("Solution to {0} is: {1}", problems[i].Method.Name , problems[i]());
                t.Stop();
                Console.WriteLine("It took {0} ms ", t.ElapsedMilliseconds);


            }

            Console.ReadKey();


        }

输出:

【问题讨论】:

  • 为什么叫秒表sw然后看t的值?

标签: c# stopwatch


【解决方案1】:
int[] methods = new[] { method1(), method2() };

在你的Stopwatch之前直接调用method1()method2()

试试

Func<int>[] methods = new Func<int>[] { method1, method2 };

t.start();
methods[1]();

例子

Func<int>[] methods = new Func<int>[] { method1, method2 };

Stopwatch sw = new Stopwatch();

for(int i = 0; i < methods.Length; i++)
{
    sw.Restart(); // or sw.Reset(); sw.Start();
    methods[i]();
    sw.Stop();

    Console.WriteLine("{0} took {1} ms", allMethods[i].Method.Name, sw.ElapsedMilliseconds);      
}

【讨论】:

  • @MeesterPatat - 不,在您的示例中,您仅获得 methods[0] 的值,这是您首次初始化数组时 method1 返回的值。
  • @MeesterPatat 我会补充一点,它甚至无法编译。在methods[1] 它写信给我:Only assignment, call, increment, decrement, await, and new object expressions can be used as a statement
  • @MeesterPatat 看看这个例子。 Stopwatch.Stop() 不会重置计时器,因此Stopwatch.Stop(); Stopwatch.Start() 将从停止的位置重新启动计时器。你必须Reset()Restart() 计时器。
  • @MeesterPatat 这是methods[i].Method.Name, sw.ElapsedMilliseconds 不是methods[i].Method.Name, t.ElapsedMillisecondssw 而不是t)。 Ideone:ideone.com/zZFYE7 注意 Mono 不支持 Restart(),所以我做了 Reset();开始();
  • @MeesterPatat 也许method2() 太快了!尝试使用ElapsedTicks 或添加Thread.Sleep(100);到method2()
【解决方案2】:

我假设您正在尝试对一组返回整数的方法进行基准测试。你可以这样做

Func<int>[] allMethods = new Func<int>[] { method1, method2 };

Stopwatch sw = new Stopwatch();
for(int i =0; i < allMethods.Length; i++)
{
    sw.Restart(); 
    allMethods[i]();
    sw.Stop();

    Console.WriteLine("{0} took {1} ms", allMethods[i].Method.Name, sw.ElapsedMilliseconds);      
}

【讨论】:

  • 谢谢,这很有帮助。只有一件事:sw.ElapsedMilliseconds 仍然无法正常工作。似乎当我做 allMethods[i]();它不仅执行方法 i,还执行 allMethods 中的所有方法。所以输出是这样的:method1 用了 500 ms,method2 用了 0 ms,method3 用了 0 ms。事实上,所有方法加起来都需要 500 毫秒。我只是通过方法中的秒表来解决它,但这可能不是最好的解决方案。
  • 这不应该发生,我无法重现该问题,您的代码中一定有其他内容。你怎么知道这三个总共花了 500 毫秒?你确定你的方法中的秒表代码没有弄乱结果吗?
  • 好的,我在开篇文章中添加了我的实际代码和输出。我做错了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多