[
https://issues.apache.org/jira/browse/MATH-628?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13069561#comment-13069561
]
Arne Plöse commented on MATH-628:
---------------------------------
One test tests with OpenMapRelVector the other with ArrayRelVector.
If you have a moderately filled OpenMapVector, the fastest way is to iterate
over. The fillstate is controlled by SPARSE_FILL_STATE. If the
OpenMapRealVector becomes filled up it may be faster to simply call
getEntry(int ) on each.
If you have a lets say ArrayRealvector the worst thing you can do is use the
iterator shown in performanceSparseVectorArray().
Im planning to create a RangeRealVector (like octave ranges). in the current
add|subtract|... methods this would use the iterator(because its no
ArrayRealVector) - not what I want for performance reasons.
So the add() is simply a pattern prototype like the add(double[]) which we have
done.
> use only SparseIterator, on RealVectors, that implement SpareRealVectors
> -------------------------------------------------------------------------
>
> Key: MATH-628
> URL: https://issues.apache.org/jira/browse/MATH-628
> Project: Commons Math
> Issue Type: Improvement
> Affects Versions: 3.0
> Reporter: Arne Plöse
> Priority: Minor
> Attachments: ArrayRealVector.diff
>
>
> the performance suffers badly if one tries to use SparseIterator when there
> is no sparse backing.
> Currently there is only a check for ArrayRealvector, all other is supposed to
> be a SparseRealvector.
> If one creates a new implementation of RealVector ... bang.
> here is a performance test case:
> {code}
> package org.apache.commons.math.linear;
> import java.util.Iterator;
> import org.junit.Test;
> /**
> *
> * @author aploese
> */
> public class PerformanceTest {
> final static int ITER = 100;
> final static int VECTOR_SIZE = 2048;
> final static double SPARSE_FILL_STATE = 0.8;
> @Test
> public void performanceSparseVectorOpenMap() {
> System.out.println("performanceSparseVectorOpenMap");
> RealVector v = new OpenMapRealVector(VECTOR_SIZE);
> for (int i = 0; i < v.getDimension() * SPARSE_FILL_STATE; i++) {
> v.setEntry(i, i);
> }
> for (int j = 0; j < ITER; j++) {
> long t1 = System.nanoTime();
> double a = 0;
> Iterator<RealVector.Entry> it = v.sparseIterator();
> RealVector.Entry e;
> while (it.hasNext() && (e = it.next()) != null) {
> a += e.getValue();
> }
> long t2 = System.nanoTime();
> for (int i = 0; i < v.getDimension(); i++) {
> a += v.getEntry(i);
> }
> long t3 = System.nanoTime();
> System.out.println(String.format("OpenMap: %d\t%s\t| %s", j,
> Long.toString(t2 - t1), Long.toString(t3 - t2)));
> }
> }
> @Test
> public void performanceSparseVectorArray() {
> System.out.println("performanceSparseVectorArray");
> RealVector v = new ArrayRealVector(VECTOR_SIZE);
> for (int i = 0; i < v.getDimension() * SPARSE_FILL_STATE; i++) {
> v.setEntry(i, i);
> }
> for (int j = 0; j < ITER; j++) {
> long t1 = System.nanoTime();
> double a = 0;
> Iterator<RealVector.Entry> it = v.sparseIterator();
> RealVector.Entry e;
> while (it.hasNext() && (e = it.next()) != null) {
> a += e.getValue();
> }
> long t2 = System.nanoTime();
> for (int i = 0; i < v.getDimension(); i++) {
> a += v.getEntry(i);
> }
> long t3 = System.nanoTime();
> System.out.println(String.format("Array: %d\t%s\t| %s", j,
> Long.toString(t2 - t1), Long.toString(t3 - t2)));
> }
> }
> {code}
> Patch will follow.
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira