如何在for循环中每50次迭代停止一次?

时间:2012-12-05 10:59:09

标签: java for-loop

在for循环中我正在进行Mongo DB Query,循环包含1500次迭代。 那么无论如何,在50次迭代之后,我想给DB一些时间,即Thread.currentThread().sleep(200);

所以请告诉我如何在每50分钟后停一会儿

for (int i = 0; i < n; i++){
    // ????
}

8 个答案:

答案 0 :(得分:11)

你使用modulo

if( i % 50 == 0 ){
    Thread.sleep(200);
}

答案 1 :(得分:4)

使用modulo的替代方法,可以使用一些cpu,是使用嵌套循环。

for (int j = 0; j < n; j += m) {
    // before every m
    for(int i = j; i < j + m && i < n; i++) {
        // inner
    }
    // after every m
}
  

这会快于%?

static int counter, counter2;

public static long testOneModLoop(int n, int m) {
    long start = System.nanoTime();
    for (int i = 0; i < n; i++) {
        counter++;
        if (i % m == m - 1)
            counter2++;
    }
    return System.nanoTime() - start;
}

public static long testTwoLoops(int n, int m) {
    long start = System.nanoTime();
    for (int j = 0; j < n; j += m) {
        for (int i = j; i < j + m && i < n; i++) {
            counter++;
        }
        counter2++;
    }
    return System.nanoTime() - start;
}

public static void main(String... args) {
    for (int i = 0; i < 5; i++) {
        int runs = 10 * 1000 * 1000;
        double time1 = (double) testOneModLoop(runs, 50) / runs;
        double time2 = (double) testTwoLoops(runs, 50) / runs;
        System.out.printf("Avg time for 1 loop: %.2f ns and 2 loops: %.2f ns%n",
                time1, time2);
    }
}

打印

Avg time for 1 loop: 6.09 ns and 2 loops: 0.78 ns
Avg time for 1 loop: 3.75 ns and 2 loops: 0.22 ns
Avg time for 1 loop: 3.67 ns and 2 loops: 0.19 ns
Avg time for 1 loop: 3.72 ns and 2 loops: 0.19 ns
Avg time for 1 loop: 3.67 ns and 2 loops: 0.19 ns

答案 2 :(得分:3)

像这样使用模数:

for (int i = 0; i < n; i++){
      if( i%50 == 0){
         Thead.sleep(200);
      }
}

每次i是50的倍数

时都是如此

答案 3 :(得分:3)

在Peter Lawrey的回答基础上,你可以把它全部放在一个循环中,避免在第一次迭代中模数和睡眠:

for (int i = 0, j = 0; i < n; ++i, ++j) { //we increment both i and j
     if (j == 50) {                       // reset auxilliary counter and go to sleep
          j = 0;                       
          Thread.sleep(100);
     }
}

修改

顺便说一句,如果你担心性能,你可以停止每64次(或两次幂)迭代并使用

这一事实
n % k == n & (k - 1) when k is a power of two and n > 0

通过这种方式,您可以将相对昂贵的模运算更改为便宜的按位&。在编程中使用两个幂的大小通常是一个好主意。

答案 4 :(得分:2)

我不认为这通常是个好主意,但当你问:

if (i % 50 == 0 && i!=0) {
// Do something
}

答案 5 :(得分:1)

无论如何睡每个'n'个查询,我都想知道这是否真的是你想要做的。而不是(我怀疑)获取一个id列表然后查询每个文档的数据库,你不能向数据库提交一个更合适的查询,并让它使用其可能优化的查询API来查找/返回信息。

答案 6 :(得分:0)

for (int i = 0; i < n; i++)
{   
    // You code here...

    if(i%50==0)
       Thead.sleep(200);
}

答案 7 :(得分:0)

你可以在循环中写一个简单的条件,如:

for (int i = 0; i < n; i++)
{
 if(i % 100 == 0){// use 100 for 100 iterations and 50 for 50 iterations
   //your sleep code 
 }  
}