如何减少完成所有for循环任务的时间?由于某种原因,我必须使用sleep(8)milliseconds.SO,完成所有循环后,在CORE i7 CPU和8GB RAM PC中需要超过2个小时。我是该领域的新手。
ExecutorService executorService = Executors.newCachedThreadPool();
//Task One
executorService.execute(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 8; i++) {
for (int j = 1; j <= 10; j++) {
for (int k = 1; k <= 1200; k++) {
for (int l = 1; l <= 10; l++) {
try {
Thread.sleep(8);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("Task # A:" + i + " AF: " + j + " C:" + k + " CF:" + l);
}
}
}
}
}
});
我正在尝试另一种方法。这是减少时间的正确方法吗?或建议我做点更好的事情。
public class Ask1 {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
//Total customer 1200
//1-400 for
System.out.println("customer range 1 to 400");
executorService.execute(new TaskThread(2,10,400));
//401 - 800
System.out.println("customer range 401 to 800");
executorService.execute(new TaskThread(2,10,400));
//801-1200
System.out.println("customer range 801 to 1200");
executorService.execute(new TaskThread(2,10,400));
executorService.shutdown();
}
}
class AskThread implements Runnable {
int agent;
int finger;
int customer;
public AskThread(int agent, int finger,int customer){
this.agent = agent;
this.finger = finger;
this.customer = customer;
}
@Override
public void run() {
for (int i = 1; i <= agent; i++) { //changeable
for (int j = 1; j <= finger; j++) { //fixed
for (int k = 1; k <= customer; k++) { //changeable
for (int l = 1; l <= finger; l++) { //fixed
try {
Thread.sleep(1);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("Task One # Agent:" + i + " Agent Finger: " + j + " Customer:" + k + " Customer Finger:" + l);
}
}
}
}
}
}
最佳答案
让我们扩大一下我的评论。正如我所说,您提供的示例过于抽象,无法给出一些具体建议以提高性能。
据我所知,您希望将工作平均分配到多个线程之间。在大多数情况下,创建x线程时,不能仅将所有“维度”除以x。
想象更具体的任务:您有一个二维矩阵,代表一个国际象棋棋盘。您想遍历矩阵中的所有元素并执行一些操作。您最终将遇到如下循环:
for (int i = 0; i < dim1; i++){
for (int j = 0; j < dim2; j++){
\\do something here
}
}
在此示例中,我们必须遍历
dim1 * dim2
元素。假设我们要在4个线程之间划分工作。如果将
dim1
和dim2
都除以4,则会得到4×4矩阵,即16个部分。当您想象物理国际象棋棋盘时,它是最可见的。如果您有4个线程,则必须将工作分成4个(通常相等)部分。在这种情况下,您可以将
dim1
和dim2
都除以2以得到总共4个部分,或者只能将一个维度除以4。编辑。可能同样适用于您的问题。如果您有x个代理商,每个代理商有20个分支,而y个客户每个有20个分支,则您可能希望将每个代理进行比较。
对于4个线程,您不能只花1/4的座席,他们的1/4的手指并与部分客户进行比较-以及仅1/4的手指。您所能做的就是取1/4代理,用他们的全部20条手指,然后与所有客户的所有手指进行比较。
关于java - 如何降低时间复杂度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60597637/