java - 提高嵌套 for 循环的速度
问题描述
我目前正在尝试解决工作问题,所以很抱歉代码必须有点模糊,但这个概念很简单,我应该能够在不具体的情况下传达我的问题。
最终目标是取两个变量(X,Y),我需要对每个 Y 运行 X。我提供的样本数据(甚至没有一半)是 X = 107 和 Y = 6400,所以我们'仅针对示例数据重新查看 684,800 次迭代。这显然需要一段时间,但我想尽我所能缩短时间。
我尝试了两种不同的方法,一种是嵌套 for 循环,一种是我尝试并行运行它,但老实说,我对并行性没有太多经验,所以我知道为什么它不起作用。在我遇到与手头问题无关的错误之前,这两种情况都运行了相同的时间(3.5 小时)
我尝试了几种使用 ParameterizedTest 在两个 CSV 中加载的不同方法,但我无法开始工作,所以如果有一种使用 JUnit 的简单方法,我很乐意听到它。我目前正在使用 JUnit 5.3.1。
尝试1:
@Test
void test() {
List<String> varX = loadCsv(path);
List<String> varY = loadCsv(otherPath);
for (String x : varX) {
for (String y : varY) {
// Do the work
}
}
}
尝试2:
@Test
void test() {
List<String> varX = loadCsv(path);
List<String> varY = loadCsv(otherPath);
varX.parallelStream().forEach(x -> {
for (String x : varX) {
for (String y : varY) {
// Do the work
}
}
}
}
解决方案
关于使用 a @ParameterizedTest
- 您可以同时加载 CSV,将它们映射到 aStream<Arguments>
并参数化测试方法以使用它们:
public static Stream<Arguments> loadTestData() {
List<String> varX = loadCsv(path);
List<String> varY = loadCsv(otherPath);
return varX.parallelStream()
.flatMap(x -> varY.parallelStream().map(y -> Arguments.of(x, y)));
}
@ParameterizedTest
@MethodSource("loadTestData")
void test(String x, String y) {
// You now have a combination of x and y:
// test that the logic under test works for that combination
}
推荐阅读
- java - 如何将我的电话应用程序包含在“打开方式”列表中?
- html - Bootstrap 3.3.7(未更新)和中心/中间不工作的复杂网格
- python - 如何通过搜索 List1 中的子字符串来查找 List2 中的完整字符串?
- javascript - 将数据库中的数据放入 React 中的图表中
- python - 使用 OpenCV 进行图像分割 - 将整个图像视为一个片段
- xamarin - 内存泄漏的模糊细节
- java - 是否可以解析地图
> 在用于 Java Dropwizard 的 Yaml 中 - c++ - C++ <> 标签是什么意思
- css - 如何将 5 个盒子与 flex 对齐?
- javascript - 在新的 Date () 方法中显示分钟