在for循环中我正在进行Mongo DB Query,循环包含1500次迭代。
那么无论如何,在50次迭代之后,我想给DB一些时间,即Thread.currentThread().sleep(200);
所以请告诉我如何在每50分钟后停一会儿
for (int i = 0; i < n; i++){
// ????
}
答案 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
}
}