[ https://issues.apache.org/jira/browse/MAHOUT-300?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12836370#action_12836370 ]
Robin Anil commented on MAHOUT-300: ----------------------------------- ok. Made maxValue and maxValueIndex as per your comments. Only difference in behaviour is for random access it could return any index which is zero as the max value as things are not ordered. I have modified dot and minus, a frequently used functions in distance measures and optimised them as follows {code} public double dot(Vector x) { if (size() != x.size()) { throw new CardinalityException(size(), x.size()); } double result = 0; if (this instanceof SequentialAccessSparseVector && x instanceof SequentialAccessSparseVector) { // For sparse SeqAccVectors. do dot product without lookup in a linear fashion Iterator<Element> myIter = iterateNonZero(); Iterator<Element> otherIter = x.iterateNonZero(); Element myCurrent = null; Element otherCurrent = null; while (myIter.hasNext() && otherIter.hasNext()) { if (myCurrent == null) myCurrent = myIter.next(); if (otherCurrent == null) otherCurrent = otherIter.next(); int myIndex = myCurrent.index(); int otherIndex = otherCurrent.index(); if (myIndex < otherIndex) { // due to the sparseness skipping occurs more hence checked before equality myCurrent = null; } else if (myIndex > otherIndex){ otherCurrent = null; } else { // both are equal result += myCurrent.get() * otherCurrent.get(); myCurrent = null; otherCurrent = null; } } return result; } else if ((this instanceof RandomAccessSparseVector || this instanceof DenseVector) && (x instanceof SequentialAccessSparseVector || x instanceof RandomAccessSparseVector)) { // Try to get the speed boost associated fast/normal seq access on x and quick lookup on this Iterator<Element> iter = x.iterateNonZero(); while (iter.hasNext()) { Element element = iter.next(); result += element.get() * getQuick(element.index()); } return result; } else { // TODO: can optimize more based on the numDefaultElements in the vectors Iterator<Element> iter = iterateNonZero(); while (iter.hasNext()) { Element element = iter.next(); result += element.get() * x.getQuick(element.index()); } return result; } } public Vector minus(Vector x) { if (size() != x.size()) { throw new CardinalityException(); } if (x instanceof RandomAccessSparseVector || x instanceof DenseVector) { Vector result = x.clone(); Iterator<Element> iter = iterateNonZero(); while (iter.hasNext()) { Element e = iter.next(); result.setQuick(e.index(), result.getQuick(e.index()) - e.get()); } return result; } else { // TODO: check the numNonDefault elements to further optimize Vector result = clone(); Iterator<Element> iter = x.iterateNonZero(); while (iter.hasNext()) { Element e = iter.next(); result.setQuick(e.index(), getQuick(e.index()) - e.get()); } return result; } } {code} Based on all these optimisation, the before and after picture. Note: these are same impl benchmarks seq.dot(seq) etc. {noformat} BenchMarks DenseVector RandomAccessSparseVector SequentialAccessSparseVector DotProduct nCalls = 20000; nCalls = 20000; nCalls = 20000; sumTime = 0.132436s; sumTime = 1.354725s; sumTime = 1.78453s; minTime = 0.0050ms; minTime = 0.053ms; minTime = 0.083ms; maxTime = 2.996ms; maxTime = 54.293ms; maxTime = 8.921ms; meanTime = 0.006621ms; meanTime = 0.067736ms; meanTime = 0.089226ms; stdDevTime = 0.029368ms; stdDevTime = 0.417954ms; stdDevTime = 0.078909ms; Speed = 151016.34 /sec Speed = 14763.144 /sec Speed = 11207.433 /sec Rate = 1812.1962 MB/s Rate = 177.15773 MB/s Rate = 134.4892 MB/s DotProduct nCalls = 20000; nCalls = 20000; nCalls = 20000; sumTime = 0.127648s; sumTime = 1.076684s; sumTime = 0.28348s; minTime = 0.0050ms; minTime = 0.043ms; minTime = 0.0090ms; maxTime = 1.101ms; maxTime = 20.54ms; maxTime = 4.556ms; meanTime = 0.006382ms; meanTime = 0.053834ms; meanTime = 0.014174ms; stdDevTime = 0.015686ms; stdDevTime = 0.207212ms; stdDevTime = 0.067221ms; Speed = 156680.88 /sec Speed = 18575.55 /sec Speed = 70551.71 /sec Rate = 1880.1705 MB/s Rate = 222.90663 MB/s Rate = 846.6206 MB/s org.apache.mahout.common.distance.CosineDistanceMeasure nCalls = 20000; nCalls = 20000; nCalls = 20000; sumTime = 11.119366s; sumTime = 33.521986s; sumTime = 30.009782s; minTime = 0.522ms; minTime = 1.552ms; minTime = 1.426ms; maxTime = 7.088ms; maxTime = 47.688ms; maxTime = 19.84ms; meanTime = 0.555968ms; meanTime = 1.676099ms; meanTime = 1.500489ms; stdDevTime = 0.090421ms; stdDevTime = 0.503179ms; stdDevTime = 0.168377ms; Speed = 1798.6637 /sec Speed = 596.62335 /sec Speed = 666.44934 /sec Rate = 21.583965 MB/s Rate = 7.1594806 MB/s Rate = 7.9973927 MB/s org.apache.mahout.common.distance.CosineDistanceMeasure nCalls = 20000; nCalls = 20000; nCalls = 20000; sumTime = 1.555915s; sumTime = 9.765366s; sumTime = 2.130194s; minTime = 0.072ms; minTime = 0.443ms; minTime = 0.098ms; maxTime = 7.128ms; maxTime = 9.95ms; maxTime = 3.214ms; meanTime = 0.077795ms; meanTime = 0.488268ms; meanTime = 0.106509ms; stdDevTime = 0.059724ms; stdDevTime = 0.163519ms; stdDevTime = 0.046013ms; Speed = 12854.172 /sec Speed = 2048.0544 /sec Speed = 9388.815 /sec Rate = 154.25008 MB/s Rate = 24.576653 MB/s Rate = 112.665794 MB/s org.apache.mahout.common.distance.EuclideanDistanceMeasure nCalls = 20000; nCalls = 20000; nCalls = 20000; sumTime = 4.756927s; sumTime = 32.704616s; sumTime = 16.252285s; minTime = 0.203ms; minTime = 1.467ms; minTime = 0.75ms; maxTime = 2.482ms; maxTime = 13.63ms; maxTime = 3.763ms; meanTime = 0.237846ms; meanTime = 1.63523ms; meanTime = 0.812614ms; stdDevTime = 0.083861ms; stdDevTime = 0.357357ms; stdDevTime = 0.095544ms; Speed = 4204.395 /sec Speed = 611.5344 /sec Speed = 1230.5962 /sec Rate = 50.452744 MB/s Rate = 7.3384137 MB/s Rate = 14.767155 MB/s org.apache.mahout.common.distance.EuclideanDistanceMeasure nCalls = 20000; nCalls = 20000; nCalls = 20000; sumTime = 1.590073s; sumTime = 9.936997s; sumTime = 2.142341s; minTime = 0.073ms; minTime = 0.442ms; minTime = 0.098ms; maxTime = 9.248ms; maxTime = 13.526ms; maxTime = 12.412ms; meanTime = 0.079503ms; meanTime = 0.496849ms; meanTime = 0.107117ms; stdDevTime = 0.07321ms; stdDevTime = 0.185974ms; stdDevTime = 0.100796ms; Speed = 12578.039 /sec Speed = 2012.6804 /sec Speed = 9335.582 /sec Rate = 150.93648 MB/s Rate = 24.152166 MB/s Rate = 112.026985 MB/s org.apache.mahout.common.distance.ManhattanDistanceMeasure nCalls = 20000; nCalls = 20000; nCalls = 20000; sumTime = 3.463162s; sumTime = 30.782008s; sumTime = 38.617236s; minTime = 0.133ms; minTime = 1.289ms; minTime = 1.749ms; maxTime = 19.493ms; maxTime = 44.531ms; maxTime = 13.406ms; meanTime = 0.173158ms; meanTime = 1.5391ms; meanTime = 1.930861ms; stdDevTime = 0.204057ms; stdDevTime = 0.496925ms; stdDevTime = 0.302304ms; Speed = 5775.069 /sec Speed = 649.7302 /sec Speed = 517.90344 /sec Rate = 69.30083 MB/s Rate = 7.796763 MB/s Rate = 6.214842 MB/s org.apache.mahout.common.distance.ManhattanDistanceMeasure nCalls = 20000; nCalls = 20000; nCalls = 20000; sumTime = 3.210922s; sumTime = 26.983053s; sumTime = 34.154993s; minTime = 0.124ms; minTime = 1.121ms; minTime = 1.548ms; maxTime = 20.179ms; maxTime = 16.974ms; maxTime = 12.913ms; meanTime = 0.160546ms; meanTime = 1.349152ms; meanTime = 1.707749ms; stdDevTime = 0.212426ms; stdDevTime = 0.490706ms; stdDevTime = 0.341319ms; Speed = 6228.74 /sec Speed = 741.20593 /sec Speed = 585.5659 /sec Rate = 74.74489 MB/s Rate = 8.894472 MB/s Rate = 7.026791 MB/s org.apache.mahout.common.distance.SquaredEuclideanDistanceMeasure nCalls = 20000; nCalls = 20000; nCalls = 20000; sumTime = 2.108722s; sumTime = 32.750794s; sumTime = 16.406358s; minTime = 0.06ms; minTime = 1.466ms; minTime = 0.75ms; maxTime = 12.239ms; maxTime = 106.425ms; maxTime = 19.271ms; meanTime = 0.105436ms; meanTime = 1.637539ms; meanTime = 0.820317ms; stdDevTime = 0.159718ms; stdDevTime = 0.824038ms; stdDevTime = 0.201979ms; Speed = 9484.417 /sec Speed = 610.6722 /sec Speed = 1219.0396 /sec Rate = 113.81301 MB/s Rate = 7.328067 MB/s Rate = 14.628475 MB/s org.apache.mahout.common.distance.SquaredEuclideanDistanceMeasure nCalls = 20000; nCalls = 20000; nCalls = 20000; sumTime = 1.57831s; sumTime = 9.910735s; sumTime = 2.123169s; minTime = 0.072ms; minTime = 0.445ms; minTime = 0.098ms; maxTime = 2.888ms; maxTime = 5.962ms; maxTime = 5.348ms; meanTime = 0.078915ms; meanTime = 0.495536ms; meanTime = 0.106158ms; stdDevTime = 0.034564ms; stdDevTime = 0.145759ms; stdDevTime = 0.050933ms; Speed = 12671.781 /sec Speed = 2018.0138 /sec Speed = 9419.881 /sec Rate = 152.06139 MB/s Rate = 24.216167 MB/s Rate = 113.03858 MB/s org.apache.mahout.common.distance.TanimotoDistanceMeasure nCalls = 20000; nCalls = 20000; nCalls = 20000; sumTime = 5.2595s; sumTime = 25.087902s; sumTime = 24.759318s; minTime = 0.246ms; minTime = 1.149ms; minTime = 1.118ms; maxTime = 7.092ms; maxTime = 13.394ms; maxTime = 7.952ms; meanTime = 0.262975ms; meanTime = 1.254395ms; meanTime = 1.237965ms; stdDevTime = 0.073059ms; stdDevTime = 0.271826ms; stdDevTime = 0.123637ms; Speed = 3802.6428 /sec Speed = 797.19696 /sec Speed = 807.7767 /sec Rate = 45.631714 MB/s Rate = 9.566364 MB/s Rate = 9.69332 MB/s org.apache.mahout.common.distance.TanimotoDistanceMeasure nCalls = 20000; nCalls = 20000; nCalls = 20000; sumTime = 1.567412s; sumTime = 9.751068s; sumTime = 2.101077s; minTime = 0.072ms; minTime = 0.442ms; minTime = 0.098ms; maxTime = 2.575ms; maxTime = 8.815ms; maxTime = 2.138ms; meanTime = 0.07837ms; meanTime = 0.487553ms; meanTime = 0.105053ms; stdDevTime = 0.031039ms; stdDevTime = 0.171094ms; stdDevTime = 0.028441ms; Speed = 12759.887 /sec Speed = 2051.0574 /sec Speed = 9518.928 /sec Rate = 153.11865 MB/s Rate = 24.61269 MB/s Rate = 114.227135 MB/s {noformat} Result: There is no difference in Manhattan distance, as its optimised for diff impls > Solve performance issues with Vector Implementations > ---------------------------------------------------- > > Key: MAHOUT-300 > URL: https://issues.apache.org/jira/browse/MAHOUT-300 > Project: Mahout > Issue Type: Improvement > Affects Versions: 0.3 > Reporter: Robin Anil > Fix For: 0.3 > > Attachments: MAHOUT-300.patch, MAHOUT-300.patch > > > AbstractVector operations like times > public Vector times(double x) { > Vector result = clone(); > Iterator<Element> iter = iterateNonZero(); > while (iter.hasNext()) { > Element element = iter.next(); > int index = element.index(); > result.setQuick(index, element.get() * x); > } > return result; > } > should be implemented as follows > public Vector times(double x) { > Vector result = clone(); > Iterator<Element> iter = result.iterateNonZero(); > while (iter.hasNext()) { > Element element = iter.next(); > element.set(element.get() * x); > } > return result; > } -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.