【问题标题】:problems diagnosing time spent in a for loop C#诊断在 for 循环 C# 中花费的时间的问题
【发布时间】:2017-02-03 18:49:57
【问题描述】:

我有一个 for 循环太长了,我不知道为什么。

Stopwatch proctime = new Stopwatch();
Stopwatch innerlooptime = new Stopwatch();
Stopwatch outerlooptime = new Stopwatch();

proctime.Start();
int length = inbtable.Rows.Count;
outerlooptime.Start();
for (int i = 0; i < length; i++)
{
    outerlooptime.Stop();
    DataRow newrow = graphdata.NewRow();
    innerlooptime.Start();
    for (int j = 0; j < graphdata.Columns.Count; j++)
    {
        colname = graphdata.Columns[j].ColumnName;
        newrow[j] = inbtable.Rows[i][colname];
    }
    innerlooptime.Stop();
    outerlooptime.Start();
    graphdata.Rows.Add(newrow);
}
proctime.Stop();

如果你把它全部计时,只花在“内循环”或 j 循环上的时间大约是 1/10 秒。

在 i 循环而不是 j 循环中花费的时间大约是 1/10 秒。

整个循环花费的时间约为 1 秒。所以 Time-iloop + Time-jloop 是总时间的 1/5。剩下的时间都花在了哪里?看一下图像,比较处理时间(代码中的proctime),外循环时间和内循环时间。为什么不把它们加起来更接近彼此?

【问题讨论】:

  • 你在第一个循环之外开始outerlooptime,但是一旦循环开始就停止它?
  • 如果您使用的是 Visual Studio,请尝试在启用 microsoft 符号的情况下运行性能分析器(选项 -> 调试 -> 符号)。 cpu 配置文件生成的“热路径”应指示哪些调用占用的时间最多。
  • James,这听起来正是我所需要的。谢谢!我马上去试试
  • Alex,我一直在努力解释,所以这包括 int i 的声明。在 j 循环之后,外循环计时器再次启动,以计算在 i++ 上花费的时间和 i

标签: c# database for-loop timer timing


【解决方案1】:

您没有显示计时器的声明,但变量名称暗示您正在查看处理器时间,而不是实际花费的时间量。处理器时间是处理器核心运行计算所花费的时间量 - 处理器在您计算机上运行的所有进程之间共享,因此在 1 秒内获得 0.2 秒的处理器时间是完全合理的。

尝试使用 Stopwatch 类:

// using System.Diagnostics;
Stopwatch sw = new Stopwatch();
sw.Start();

DoThings(); // run your code

sw.Stop();
Debug.WriteLine("Actual time elapsed: " + sw.Elapsed.ToString());

【讨论】:

  • 它们实际上是秒表,我将 proctime 标记为循环的处理时间。
  • 抱歉,我的假设不好。也许DataRow newrow = graphdata.NewRow(); 占用了很多时间——这两个循环似乎都没有计算在内。实例化对象所花费的时间不可忽略...
【解决方案2】:

我想出了答案。这真的很傻。我在函数末尾的消息框语句中切换了秒表,因此一个秒表被报告为另一个秒表。所有时间都花在了我发布的代码之外的其他地方。感谢您所有的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 2019-07-06
    • 2013-03-05
    • 2011-08-30
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    相关资源
    最近更新 更多