Skip to content

Commit d9ff43c

Browse files
gselzerelevans
authored andcommitted
Make DefaultMedian faster
1 parent ed80f91 commit d9ff43c

File tree

2 files changed

+12
-6
lines changed

2 files changed

+12
-6
lines changed

scijava-ops-image/src/main/java/org/scijava/ops/image/stats/DefaultMedian.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,10 @@
2929

3030
package org.scijava.ops.image.stats;
3131

32-
import java.util.ArrayList;
33-
3432
import net.imglib2.type.numeric.RealType;
3533

34+
import org.scijava.collections.DoubleArray;
3635
import org.scijava.function.Computers;
37-
import org.scijava.ops.spi.Op;
3836
import org.scijava.ops.spi.OpDependency;
3937

4038
/**
@@ -55,6 +53,11 @@ public class DefaultMedian<I extends RealType<I>, O extends RealType<O>>
5553
@OpDependency(name = "stats.quantile")
5654
private Computers.Arity2<Iterable<I>, Double, O> quantileOp;
5755

56+
/**
57+
* TODO: One/many of these lists could get really big over time. Maybe that will be a problem?
58+
*/
59+
private static final ThreadLocal<DoubleArray> BUFFER = ThreadLocal.withInitial(DoubleArray::new);
60+
5861
/**
5962
* TODO
6063
*
@@ -63,9 +66,11 @@ public class DefaultMedian<I extends RealType<I>, O extends RealType<O>>
6366
*/
6467
@Override
6568
public void compute(final Iterable<I> input, final O median) {
66-
final var statistics = new ArrayList<Double>();
69+
final var statistics = BUFFER.get();
70+
statistics.clear();
71+
// final var statistics = new ArrayList<Double>();
6772

68-
input.forEach(i -> statistics.add(i.getRealDouble()));
73+
input.forEach(i -> statistics.addValue(i.getRealDouble()));
6974

7075
final var k = statistics.size() / 2;
7176
var result = DefaultQuantile.select(statistics, k);

scijava-ops-image/src/main/java/org/scijava/ops/image/stats/DefaultQuantile.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.scijava.function.Computers;
3434

3535
import java.util.ArrayList;
36+
import java.util.List;
3637

3738
import static java.util.Collections.swap;
3839

@@ -83,7 +84,7 @@ public void compute(final Iterable<I> input, final N quantile,
8384
* This an all-in-one method version of your basic quick select algorithm.
8485
* </p>
8586
*/
86-
static double select(final ArrayList<Double> array, final int k) {
87+
static double select(final List<Double> array, final int k) {
8788

8889
var left = 0;
8990
var right = array.size() - 1;

0 commit comments

Comments
 (0)