我正在编写一个程序,其中某个for-循环被多次迭代。
一次迭代不会花费很长时间,但是由于程序经常迭代循环,因此计算起来需要相当长的时间。
为了在不降低进度的情况下获得更多关于程序进度的信息,我想在每一步打印进度。
有什么不同的方法可以做到这一点,而不是像这样的有条件的模组:
for(int i = 0; i < some_large_number; i++){
if(i % x == 0)
printf("%f%%\r", percent);
//some other code
.
.
.
}谢谢是提前
发布于 2020-04-29 14:18:59
此代码:
for(int i = 0; i < some_large_number; i++){
if(i % x == 0)
printf("%f%%\r", percent);
//some other code
.
.
.
}可调整为:
/* 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测试。这对于内部循环来说是最优的,因为它尽可能地减少了名义工作量,尽管现实世界的硬件有时会有一些精巧的行为,从而导致较少实际工作的计算时间。引入了block和limit,但可以更改它们以避免与原始代码中的使用发生任何冲突。除了以上所述,内部循环的操作与原始代码相同:它看到的i值与原始代码的顺序相同。因此不需要进行任何更改,因为code.some_large_number+(x-1)可能会使int.溢出。
发布于 2020-04-29 13:03:40
我会这样做:
int j = x;
for (int i = 0; i < some_large_number; i++){
if(--j == 0) {
printf("%f%%\r", percent);
j = x;
}
//some other code
.
.
.
}发布于 2020-04-29 13:25:11
关于性能问题,最快的方法是使用嵌套循环:
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:
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 */
}https://stackoverflow.com/questions/61502292
复制相似问题