gpt4 book ai didi

java - 并发方法是加速长时间迭代的好主意吗?

转载 作者:行者123 更新时间:2023-11-30 07:36:28 25 4
gpt4 key购买 nike

我有一个应用程序会随着时间的推移进行迭代以在图表上创建点。当我为 x 轴上的每个点收集数据时,我还必须执行递归查找,这实际上意味着我在另一个循环中有一个循环。这不是很好地缩放。我没有看到很多在迭代中使用“分而治之”解决方案的例子。我正在考虑使用 Java 的 Executor 并发框架在它自己的线程中运行每个循环,等待答案,收集结果并返回它们。我得到的初步测试结果似乎并没有那么快。我知道我应该展示一些代码,但我首先想知道的是,与我可能不熟悉的更好方法相比,这种方法是否有优点。提前致谢!

添加一些 groovyish/javaish 伪代码来帮助思考这个问题:

class Car {
id
model
make
weight
}

for (number in listOfImportantCarIDs) {
Car car = carsMap.get(number) // find the car we care about
String maker = car.make //get it's 'parent'

// get amount of all related cars
Iterator<Car> allcars = carsMap.values().iterator();
while (allcars.hasNext()) {
Car aCar = alldocs.next();
if (maker.equals(aCar.make)) {
totalCarCount++; // increment total related cars
BigDecimal totalWeightofAllCars = totalWeightofAllCars.add(aCar.getWeight()); // add weight to total

// a ghetto cache to prevent double counting
countedMaufacturers.add(make);
}
}
}

最佳答案

使用线程将通过一些小的常数因子加速您的应用程序,但代价是线程间通信的复杂性显着增加。如果存在更好的算法,那可以为您节省几个数量级。因此,我强烈建议您首先验证确实没有次二次算法可以解决您的问题。

也许如果您详细说明了您正在尝试解决的问题以及您当前的解决方案,我们可以在这里提供帮助。

编辑:天哪,找到一个更好的算法一点也不难:

for (Car car : cars {
Stats s = stats.get(car.maker);
if (s == null) {
s = new Stats();
stats.put(car.maker, s);
}
stats.count++;
stats.totalWeight+=car.weight;
}

for (Car car in importantCars) {
stats.get(car.maker);
}

确实没有必要为每辆重要的汽车迭代,遍历所有汽车只是为了找到具有相同制造商的汽车......

关于java - 并发方法是加速长时间迭代的好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3587821/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com