首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >高效地打印for循环中的每个x次迭代。

高效地打印for循环中的每个x次迭代。
EN

Stack Overflow用户
提问于 2020-04-29 12:54:59
回答 4查看 546关注 0票数 4

我正在编写一个程序,其中某个for-循环被多次迭代。

一次迭代不会花费很长时间,但是由于程序经常迭代循环,因此计算起来需要相当长的时间。

为了在不降低进度的情况下获得更多关于程序进度的信息,我想在每一步打印进度。

有什么不同的方法可以做到这一点,而不是像这样的有条件的模组:

代码语言:javascript
复制
for(int i = 0; i < some_large_number; i++){
    if(i % x == 0)
        printf("%f%%\r", percent);
    //some other code
    .
    .
    .
}

谢谢是提前

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-04-29 14:18:59

此代码:

代码语言:javascript
复制
for(int i = 0; i < some_large_number; i++){
    if(i % x == 0)
        printf("%f%%\r", percent);
    //some other code
    .
    .
    .
}

可调整为:

代码语言:javascript
复制
/*  Partition the execution into blocks of x iterations, possibly including a
    final fragmentary block.  The expression (some_large_number+(x-1))/x
    calculates some_large_number/x with any fraction rounded up.
*/
for (int block = 0, i = 0; block < (some_large_number+(x-1))/x; ++block)
{
    printf("%f%%\r", percent);

    //  Set limit to the lesser of the end of the current block or some_large_number.
    int limit = (block+1) * x;
    if (some_large_number < limit) limit = some_large_number;

    //  Iterate the original code.
    for (; i < limit; ++i)
    {
        //some other code
    }
}

有以下注意事项和属性:

  • 内环没有原始循环更多的工作(它没有额外的变量可计数或测试),并且完全删除了i % x == 0测试。这对于内部循环来说是最优的,因为它尽可能地减少了名义工作量,尽管现实世界的硬件有时会有一些精巧的行为,从而导致较少实际工作的计算时间。引入了
  • 新标识符blocklimit,但可以更改它们以避免与原始代码中的使用发生任何冲突。除了以上所述,内部循环的操作与原始代码相同:它看到的i值与原始代码的顺序相同。因此不需要进行任何更改,因为code.
  • some_large_number+(x-1)可能会使int.

溢出。

票数 2
EN

Stack Overflow用户

发布于 2020-04-29 13:03:40

我会这样做:

代码语言:javascript
复制
int j = x;
for (int i = 0; i < some_large_number; i++){
    if(--j == 0) {
        printf("%f%%\r", percent);
        j = x;
    }
    //some other code
    .
    .
    .
}
票数 2
EN

Stack Overflow用户

发布于 2020-04-29 13:25:11

关于性能问题,最快的方法是使用嵌套循环:

代码语言:javascript
复制
unsigned int x = 6;
unsigned int segments = some_large_number / x; 
unsigned int y;

for ( unsigned int i = 0; i < segments; i++ ) {

    printf("%f%%\r", percent); 

    for ( unsigned int j = 0; j < x; j++ ) {

       /* some code here */

    }
}


// If some_large_number can´t be divided evenly through `x`:

if (( y = (some_large_number % x)) != 0 )
{
    for ( unsigned int i = 0; i < y; i++ ) {

       /* same code as inside of the former inner loop. */

    }
}

另一个例子是使用一个不同的计数变量来执行打印过程,方法是将该变量与x - 1进行比较,如果匹配,则将该变量重置为-1

代码语言:javascript
复制
unsigned int x = 6;
unsigned int some_large_number = 100000000;

for ( unsigned int i = 0, int j = 0; i < some_large_number; i++, j++ ) {

    if(j == (x - 1))
    {
        printf("%f%%\r", percent);
        j = -1;
    }
    /* some code here */
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61502292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档