【问题标题】:while-loop finishes a loop but takes a long time to begin the next loopwhile-loop 完成一个循环,但需要很长时间才能开始下一个循环
【发布时间】:2016-02-25 02:03:55
【问题描述】:

我正在使用 C++ 编程并在优化领域实现大规模算法。我有一个巨大的while循环,里面有很多东西。循环的条件只是比较两个整数ab。我分两点报告时间:

1- 当程序到达while循环结束时。

2- 当程序处于 while 循环的开头时。

代码如下

        while (a<b){
            //Report time at the beginning of the loop
            time_t beginT = time(0);
            char* dtBegin = ctime (&beginT);
            cout << "Time at the beginning of the loop: " << dtBegin << endl;
            .
            .
            . //all of the other functions inside the loop
            //Report time at the end of the loop
            time_t endT = time(0);
            char* dtEnd = ctime (&endT);
            cout << "Time at the end of the loop: " << dtEnd << endl;
        }

当程序到达循环结束时,需要很长时间才能回到循环的开头,即对于大型输入实例可能需要大约 20 分钟。需要强调的是,循环内的所有操作都执行完毕并报告了时间,而这20分钟只是让程序回到循环的开头。

我想知道这段时间花在什么上面,我该如何减少它?

感谢任何帮助。

附:循环中的点表示代码中不能共享的机密部分。

【问题讨论】:

  • 您在哪个平台上运行此程序,该系统的负载是多少?
  • 一些事情。您确定您的消息会立即刷新(例如,在终端上,行缓冲有效,但输出到日志需要显式刷新)?如果您有 数据,您是否在分页/交换(例如 10GB RAM 但使用 50GB 交换)? 可能需要 20 分钟才能调出/调入。虽然您不能发布专有代码,但几轮的时间消息怎么样?这显示了时间“循环”和开始/停止时间。
  • 这种行为通常是由内存管理引起的......但是20分钟?那只能是交换。 RAM 碎片整理不需要 20 分钟...
  • 在循环范围内创建的任何对象都将在右大括号处销毁。如果这些内容庞大且复杂,则可能需要一段时间。
  • 如果将std::cout 替换为std::cerr 会怎样?

标签: c++ performance loops time while-loop


【解决方案1】:

您的仪器已损坏,将循环范围内的对象的析构函数计数为循环结束。解决方法很简单:

    while (a<b){
        //Report time at the beginning of the loop
        time_t beginT = time(0);
        char* dtBegin = ctime (&beginT);
        cout << "Time at the beginning of the loop: " << dtBegin << endl;
        {
            .
            .
            . //all of the other functions inside the loop
        }
        //Report time at the end of the loop
        time_t endT = time(0);
        char* dtEnd = ctime (&endT);
        cout << "Time at the end of the loop: " << dtEnd << endl;
    }

现在,循环内部有自己的作用域,析构函数在该作用域退出时运行,并且它们被正确地计算为循环迭代所花费的时间。

【讨论】:

  • 或者添加更多的工具 - 计时内部和析构函数。
  • 你的解决方案只是改变了延迟发生的地方。它不是在打印时间之后发生,而是在它之前徘徊。
  • @hmd.pouya 对。问题是延迟发生在错误的地方,导致您无法知道时间花在哪里或如何减少时间。现在它出现在正确的位置,您知道它是什么(循环范围内的析构函数)。
  • @David,你是对的。现在,您对加快销毁过程有何建议?
  • 看不到代码我无法告诉你如何优化代码。也许您可以重复使用这些结构而不是破坏它们。也许析构函数会以最无效率的顺序破坏事物。也许它不必要地获得了细粒度的锁。也许您可以从使用自定义分配器中获得巨大的好处。我不知道。
猜你喜欢
  • 2018-11-07
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多