[
https://issues.apache.org/jira/browse/MATH-841?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13430566#comment-13430566
]
Phil Steitz edited comment on MATH-841 at 8/7/12 8:08 PM:
----------------------------------------------------------
The Guava implementation looks similar to what we have implemented in the
source now, which *should* be faster than the naive algorithm. The algorithm
that Guava and the current impl are based on is the so-called "Binary GCD"
algorithm [1], mentioned in the original submission of this code to commons
lang [1] described in [2]
[1] http://markmail.org/message/p6vfz763ap3g5icn
[2] http://en.wikipedia.org/wiki/Binary_GCD_algorithm
So either a) our implementation is bad b) the choice of data for the
microbenchmarks is misleading or c) something else is going on.
was (Author: psteitz):
The Guava implementation looks similar to what we have implemented in the
source now, which *should* be faster than the naive algorithm. The algorithm
that Guava and the current impl are based on is the so-called "Binary GCD"
algorithm [1], mentioned in the original submission of this code to commons
lang [2] described in [2]
[1] http://en.wikipedia.org/wiki/Binary_GCD_algorithm
[2] http://markmail.org/message/p6vfz763ap3g5icn
So either a) our implementation is bad b) the choice of data for the
microbenchmarks is misleading or c) something else is going on
> gcd speed up
> ------------
>
> Key: MATH-841
> URL: https://issues.apache.org/jira/browse/MATH-841
> Project: Commons Math
> Issue Type: Improvement
> Affects Versions: 3.0
> Environment: ubuntu 32bits/intel-i5/java6
> Reporter: Sebastien Riou
> Priority: Trivial
> Labels: patch, performance
> Fix For: 3.1
>
> Attachments: ArithmeticUtils.java, patchGcdInt2.txt
>
> Original Estimate: 1h
> Remaining Estimate: 1h
>
> The gcd(int,int) method of ArithmeticUtils seems 2 times slower than the
> naive approach using modulo operator. The following test code runs in 11s
> with current version and in 6s with the patch.
> public void testApache(){
> Random rng=new Random(0);
> long checksum=0;
> long start=System.nanoTime();
> checksum+=gcd(0,Integer.MAX_VALUE);
> checksum+=gcd(Integer.MAX_VALUE,0);
> checksum+=gcd(Integer.MAX_VALUE,rng.nextInt());
> for(int i=0;i<10000;i++)
> checksum+=gcd(rng.nextInt(),Integer.MAX_VALUE);
> checksum+=gcd(Integer.MAX_VALUE,Integer.MAX_VALUE);
> checksum+=gcd(Integer.MIN_VALUE,1<<30);
> checksum+=gcd(1<<30,1<<30);
> checksum+=gcd(3 * (1<<20),9 * (1<<15));
> for(int i=0;i<30000000;i++)
> checksum+=gcd(rng.nextInt(),rng.nextInt());
> long end=System.nanoTime();
> long tns=end-start;
> long tms=(tns+500000)/1000000;
> long ts=(tms+500)/1000;
> System.out.println("exec time="+ts+"s, ("+tms+"ms),
> checksum="+checksum);
> assertEquals(9023314441L,checksum);
> }
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira