[ 
https://issues.apache.org/jira/browse/MATH-628?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13069936#comment-13069936
 ] 

Arne Plöse commented on MATH-628:
---------------------------------

No, I read the test results as followns

performanceSparseVectorOpenMap [ms]
OpenMap   0: 2,193495| 0,546502
OpenMap   1: 0,473553| 0,561220
OpenMap   2: 0,472653| 0,502726
OpenMap   3: 0,496373| 0,545859
OpenMap   4: 0,472649| 0,502994
OpenMap   5: 1,839328| 0,642802
OpenMap   6: 1,885942| 0,221290
OpenMap   7: 1,794967| 0,200146
OpenMap   8: 0,523872| 0,211437
OpenMap   9: 0,547421| 0,210671
OpenMap  10: 0,464470| 0,213004
OpenMap  11: 0,453697| 0,227102
OpenMap  12: 0,467708| 0,212261
OpenMap  13: 0,456612| 0,209729
OpenMap  14: 0,341679| 0,209290
OpenMap  15: 0,337983| 0,201675
OpenMap  16: 0,347159| 0,216204
OpenMap  17: 0,351441| 0,220569
OpenMap  18: 0,350658| 0,230405
OpenMap  19: 0,197148| 0,223062
OpenMap  20: 0,204231| 0,235119
OpenMap  21: 0,196417| 0,227486
OpenMap  22: 0,194752| 0,220574
OpenMap  23: 0,190178| 0,219967
OpenMap  24: 0,194665| 0,221576
OpenMap  25: 0,192412| 0,211655
OpenMap  26: 0,196861| 0,229008
OpenMap  27: 0,194389| 0,220088
OpenMap  28: 0,190136| 0,223112
OpenMap  29: 0,202440| 0,213385
OpenMap  30: 0,181508| 0,207300
OpenMap  31: 0,149114| 0,028321
OpenMap  32: 0,023019| 0,017210
OpenMap  33: 0,008716| 0,018064
OpenMap  34: 0,011649| 0,018109
OpenMap  35: 0,008456| 0,018238
OpenMap  36: 0,008413| 0,018072
OpenMap  37: 0,008591| 0,018053
OpenMap  38: 0,008789| 0,018068
OpenMap  39: 0,008560| 0,018012
OpenMap  40: 0,008580| 0,018091
OpenMap  41: 0,008687| 0,018018
OpenMap  42: 0,008683| 0,018019
OpenMap  43: 0,008512| 0,018158
OpenMap  44: 0,008542| 0,017957
OpenMap  45: 0,008455| 0,018108
OpenMap  46: 0,008524| 0,017895
OpenMap  47: 0,008639| 0,017938
OpenMap  48: 0,008518| 0,018147
OpenMap  49: 0,008516| 0,018192
OpenMap  50: 0,008521| 0,018250
OpenMap  51: 0,008598| 0,018003
OpenMap  52: 0,008901| 0,018056
OpenMap  53: 0,008656| 0,018094
OpenMap  54: 0,007719| 0,016857
OpenMap  55: 0,008490| 0,017892
OpenMap  56: 0,008716| 0,017868
OpenMap  57: 0,008927| 0,017806
OpenMap  58: 0,008368| 0,018084
OpenMap  59: 0,008585| 0,018113
OpenMap  60: 0,008676| 0,017787
OpenMap  61: 0,008688| 0,017845
OpenMap  62: 0,008853| 0,018119
OpenMap  63: 0,008308| 0,017961
OpenMap  64: 0,008451| 0,018148
OpenMap  65: 0,008537| 0,017905
OpenMap  66: 0,008787| 0,018121
OpenMap  67: 0,008412| 0,017983
OpenMap  68: 0,008615| 0,018132
OpenMap  69: 0,008770| 0,017918
OpenMap  70: 0,008551| 0,017938
OpenMap  71: 0,008653| 0,017993
OpenMap  72: 0,008806| 0,017984
OpenMap  73: 0,008737| 0,017939
OpenMap  74: 0,008460| 0,018116
OpenMap  75: 0,008575| 0,018017
OpenMap  76: 0,008489| 0,018077
OpenMap  77: 0,008540| 0,017966
OpenMap  78: 0,008562| 0,017979
OpenMap  79: 0,008710| 0,018037
OpenMap  80: 0,008374| 0,018112
OpenMap  81: 0,008734| 0,017927
OpenMap  82: 0,008277| 0,018002
OpenMap  83: 0,008814| 0,017976
OpenMap  84: 0,008848| 0,017868
OpenMap  85: 0,008465| 0,018097
OpenMap  86: 0,008359| 0,018092
OpenMap  87: 0,008425| 0,018087
OpenMap  88: 0,008855| 0,017925
OpenMap  89: 0,008591| 0,017956
OpenMap  90: 0,008410| 0,018052
OpenMap  91: 0,008617| 0,018220
OpenMap  92: 0,008591| 0,018299
OpenMap  93: 0,008401| 0,018163
OpenMap  94: 0,008709| 0,018123
OpenMap  95: 0,008659| 0,018015
OpenMap  96: 0,008620| 0,017959
OpenMap  97: 0,008716| 0,018079
OpenMap  98: 0,008704| 0,017987
OpenMap  99: 0,008560| 0,018004
performanceSparseVectorArray [ms]
Array   0: 2,023287 | 0,186070
Array   1: 0,917888 | 0,204991
Array   2: 0,892925 | 0,143712
Array   3: 0,858185 | 0,146076
Array   4: 0,684331 | 0,155737
Array   5: 1,633593 | 0,138014
Array   6: 0,927778 | 0,148148
Array   7: 0,339777 | 0,144761
Array   8: 0,339778 | 0,144736
Array   9: 0,351218 | 0,143813
Array  10: 0,298786 | 0,144916
Array  11: 0,283394 | 0,145615
Array  12: 0,287752 | 0,144766
Array  13: 0,284476 | 0,144178
Array  14: 0,291953 | 0,143550
Array  15: 0,285529 | 0,144774
Array  16: 0,186793 | 0,144802
Array  17: 0,147914 | 0,145032
Array  18: 0,147936 | 0,144418
Array  19: 0,147397 | 0,144305
Array  20: 0,152120 | 0,145130
Array  21: 0,149030 | 0,144778
Array  22: 0,149788 | 0,144240
Array  23: 0,148297 | 0,145124
Array  24: 0,148502 | 0,144080
Array  25: 0,149361 | 0,144171
Array  26: 0,149198 | 0,144395
Array  27: 0,149126 | 0,144326
Array  28: 0,148975 | 0,144261
Array  29: 0,148939 | 0,144159
Array  30: 0,149005 | 0,144271
Array  31: 0,148844 | 0,144786
Array  32: 0,149205 | 0,144876
Array  33: 0,148771 | 0,144281
Array  34: 0,149221 | 0,144267
Array  35: 0,148602 | 0,144336
Array  36: 0,148915 | 0,144937
Array  37: 0,169016 | 0,145081
Array  38: 0,148983 | 0,144216
Array  39: 0,147412 | 0,144056
Array  40: 0,149133 | 0,144219
Array  41: 0,149274 | 0,144240
Array  42: 0,152563 | 0,022058
Array  43: 0,026914 | 0,002256
Array  44: 0,012159 | 0,002192
Array  45: 0,012191 | 0,002256
Array  46: 0,012321 | 0,002258
Array  47: 0,012073 | 0,002192
Array  48: 0,012214 | 0,002187
Array  49: 0,012196 | 0,002189
Array  50: 0,012625 | 0,002208
Array  51: 0,012086 | 0,002273
Array  52: 0,012184 | 0,002211
Array  53: 0,012132 | 0,002192
Array  54: 0,012281 | 0,002313
Array  55: 0,012174 | 0,002281
Array  56: 0,012225 | 0,002188
Array  57: 0,012233 | 0,002189
Array  58: 0,012423 | 0,002187
Array  59: 0,011971 | 0,002205
Array  60: 0,012101 | 0,002307
Array  61: 0,012121 | 0,002321
Array  62: 0,012189 | 0,002181
Array  63: 0,012182 | 0,002258
Array  64: 0,012125 | 0,002204
Array  65: 0,012049 | 0,002209
Array  66: 0,012372 | 0,002186
Array  67: 0,011879 | 0,002214
Array  68: 0,012371 | 0,002230
Array  69: 0,012265 | 0,002226
Array  70: 0,012274 | 0,002269
Array  71: 0,012264 | 0,002311
Array  72: 0,012286 | 0,002185
Array  73: 0,012225 | 0,002206
Array  74: 0,012274 | 0,002288
Array  75: 0,012264 | 0,002256
Array  76: 0,012278 | 0,002301
Array  77: 0,012346 | 0,002284
Array  78: 0,012269 | 0,002227
Array  79: 0,012175 | 0,002295
Array  80: 0,015729 | 0,002221
Array  81: 0,012204 | 0,002211
Array  82: 0,012382 | 0,002192
Array  83: 0,012179 | 0,002297
Array  84: 0,012232 | 0,002211
Array  85: 0,012251 | 0,002220
Array  86: 0,012448 | 0,002204
Array  87: 0,012327 | 0,002283
Array  88: 0,012456 | 0,002253
Array  89: 0,012513 | 0,002230
Array  90: 0,012386 | 0,002269
Array  91: 0,012287 | 0,002308
Array  92: 0,012261 | 0,002289
Array  93: 0,012358 | 0,002247
Array  94: 0,012452 | 0,002302
Array  95: 0,012316 | 0,002305
Array  96: 0,012321 | 0,002226
Array  97: 0,012276 | 0,002209
Array  98: 0,012220 | 0,002220
Array  99: 0,012398 | 0,002215

The SparseRealvector is filled to 50%.
Conclusion:

If you have an OpenMapRealvector Iteration is the fastest you can get.
If you have an ArrayRealvector random access is the fastes.
Note at around 35 (20 - 40) - I think the JIT Compiler is kicking in ...

My fix takes honours this.

> 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


Reply via email to