ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/loops/DynamicLeftSpineFib.java
(Generate patch)

Comparing jsr166/src/test/loops/DynamicLeftSpineFib.java (file contents):
Revision 1.6 by jsr166, Tue Nov 3 01:04:02 2009 UTC vs.
Revision 1.7 by dl, Sat Nov 14 20:58:11 2009 UTC

# Line 4 | Line 4
4   * http://creativecommons.org/licenses/publicdomain
5   */
6  
7 //import jsr166y.*;
7   import java.util.*;
8   import java.util.concurrent.*;
9  
# Line 12 | Line 11 | public final class DynamicLeftSpineFib e
11  
12      // Performance-tuning constant:
13      static long lastStealCount;
14 <
14 >  
15      public static void main(String[] args) throws Exception {
16          int procs = 0;
17          int num = 43;
# Line 23 | Line 22 | public final class DynamicLeftSpineFib e
22                  num = Integer.parseInt(args[1]);
23          }
24          catch (Exception e) {
25 <            System.out.println("Usage: java DynamicLeftSpineFib <threads> <number> [<sequentialThreshold>]");
25 >            System.out.println("Usage: java DynamicLeftSpineFib <threads> <number> [<sequntialThreshold>]");
26              return;
27          }
28  
29 <
29 >        
30          for (int reps = 0; reps < 2; ++reps) {
31 <            ForkJoinPool g = (procs == 0) ?
33 <                new ForkJoinPool() :
31 >            ForkJoinPool g = procs == 0? new ForkJoinPool() :
32                  new ForkJoinPool(procs);
33              lastStealCount = g.getStealCount();
34              for (int i = 0; i < 10; ++i) {
# Line 47 | Line 45 | public final class DynamicLeftSpineFib e
45          DynamicLeftSpineFib f = new DynamicLeftSpineFib(num, null);
46          g.invoke(f);
47          long time = System.currentTimeMillis() - start;
48 <        double secs = (double) time / 1000.0;
48 >        double secs = ((double)time) / 1000.0;
49          long result = f.getAnswer();
50 <        System.out.print("DynamicLeftSpineFib " + num + " = " + result);
50 >        System.out.print("DLSFib " + num + " = " + result);
51          System.out.printf("\tTime: %7.3f", secs);
52          long sc = g.getStealCount();
53          long ns = sc - lastStealCount;
# Line 64 | Line 62 | public final class DynamicLeftSpineFib e
62      int number;
63      DynamicLeftSpineFib next;
64  
65 <    DynamicLeftSpineFib(int n, DynamicLeftSpineFib nxt) {
66 <        number = n; next = nxt;
65 >    DynamicLeftSpineFib(int n, DynamicLeftSpineFib nxt) {
66 >        number = n; next = nxt;
67      }
68  
69      int getAnswer() {
# Line 75 | Line 73 | public final class DynamicLeftSpineFib e
73      public final void compute() {
74          int n = number;
75          if (n > 1) {
76 +            int r = 0;
77              DynamicLeftSpineFib rt = null;
78 <            while (n > 1 && getSurplusQueuedTaskCount() <= 3) {
79 <                (rt = new DynamicLeftSpineFib(n - 2, rt)).fork();
78 >            while (getSurplusQueuedTaskCount() <= 3) {
79 >                int m = n - 2;
80                  n -= 1;
81 +                if (m <= 1) {
82 +                    r += m;
83 +                    if (n > 1) {
84 +                        r += n - 2;
85 +                        n -= 1;
86 +                    }
87 +                    break;
88 +                }
89 +                (rt = new DynamicLeftSpineFib(m, rt)).fork();
90              }
91 <            int r = seqFib(n);
91 >            r += seqFib(n);
92              while (rt != null) {
93                  if (rt.tryUnfork()) rt.compute(); else rt.helpJoin();
94                  r += rt.number;
# Line 92 | Line 100 | public final class DynamicLeftSpineFib e
100  
101      // Sequential version for arguments less than threshold
102      static int seqFib(int n) {
103 <        if (n <= 1)
103 >        if (n <= 1)
104              return n;
105 <        else
105 >        else
106              return seqFib(n-1) + seqFib(n-2);
107      }
108 <
108 >    
109   }
110 +

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines