我在Java 8中编程时遇到以下问题。HashSet“ mySet”通常包含数千个整数,这是我编程的瓶颈。它经常执行。加快速度可以缩短执行时间。
void doStuff(int val){
for (int i : mySet) {
if (val > limits)
alpha = arrayA[i] + arrayB[val];
else
alpha = arrayK[i][val] + arrayA[i] + arrayB[val];
if (cmpArray[i] > alpha) {
cmpArray[i] = alpha;
arrayC[i] = val;
}
if (alpha == 0) {
zeroSet.add(i);
}
}
}
我试图使用并行流来使这项工作更快地完成:
void doStuff(int val){
if (val > limits)
mySet
.parallelStream()
.filter(p -> this.cmpArray[p] > -(arrayA[p] + arrayB[val]))
.forEach(p -> op(p, val, -(arrayA[p] + arrayB[val])));
else
mySet
.parallelStream()
.filter(p -> this.alpha[p] > arrayK[p][val] - arrayA[p] - arrayB[val])
.forEach(p -> op(p, val, arrayK[p][val] - arrayA[p] - arrayB[val]));
for (int i : mySet()) {
if (arrayA[i] == 0) {
zeroSet.add(i);
}
}
void op(int p, int val, int alpha){
cmpArray[p] = alpha;
arrayC[p] = val;
}
我无法并行化HashSet-Function add()。这导致了一些奇怪的结果。谁能给我一个关键字,寻找什么以便了解发生了什么?甚至有机会并行处理此代码吗?
我不想让您为我解决问题,而只是检查我是否在正确的轨道上:-D
感谢您的答复。
最好,山姆
答案 0 :(得分:0)
请注意,HashSet
实现不是线程安全的。多线程添加元素会破坏数据集。
为了并行化循环,必须创建一个新的Set。
替换
for (int i : mySet()) {
if (arrayA[i] == 0) {
zeroSet.add(i);
}
}
使用
zeroSet = mySet
.parallelStream()
.filter(i -> arrs[i] == 0)
.collect(Collectors.toSet());
希望这会有所帮助:)