java - 如何降低时间复杂度
问题描述
如何减少完成所有 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 x 4 矩阵,即 16 个部分。当您想象一个物理棋盘时,它是最明显的。
如果您有 4 个线程,则必须将工作分成 4 个(通常相等)部分。在这种情况下,您可以将dim1
和dim2
除以 2 得到总共 4 个部分,或者仅将一个维度除以 4。
编辑。可能同样适用于您的问题。如果您有 x 个代理,每个有 20 个手指,y 个客户每个有 20 个手指,您可能希望将每个代理与每个代理进行比较。
对于 4 个线程,您不能只拿 1/4 的代理、他们的 1/4 手指并与部分客户进行比较 - 并且只有他们的 1/4 手指。你能做的就是拿1/4的代理,全部20根手指,和所有客户的全部手指进行比较。
推荐阅读
- jdbc - 如何使用 Grafana 监控 JDBC 调用和统计信息
- openssl - 如何创建自己的扩展验证证书以显示绿条?
- matlab - 在matlab中创建间隔[a,b]的线性对数对数线性分区,但匹配步骤
- node.js - req.flash() 需要会话但会话存在
- node.js - 如果 JS stacktrace 中的行号超出文件末尾是什么意思?
- javascript - 在“npm”注册表中找不到“babel-code-frame@^6.26.0”所需的包“chalk@^1.1.3”(纱线添加)
- mysql - 将 CONCAT 与 GROUP_CONCAT 一起使用
- javascript - 无法使用 Map.Keys() 函数
- php - 来自 Azure 容器的 PHP 请求 blob 文件
- python - 当我将数据附加到列时,数据不会“粘附”到我的 DataFrame