summaryrefslogtreecommitdiff
path: root/testsuite/tests/programs/jules_xref/Main.hs
blob: 19f364d0f9c274fc9f35ce873a81a747d5a3c394 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
-- !!! a performance-problem test from Jules.
--  further comment at the end
-- 
module Main where 

import Data.Char -- 1.3

--1.3:data Maybe a = Nothing | Just a

data ATree a b = ALeaf
               | ABranch (ATree a b) a [b] (ATree a b) Int
                 -- deriving (Eq)

type SymTable = ATree String Int


pp_tree :: SymTable -> String
pp_tree ALeaf = ""
pp_tree (ABranch l k vs r h)
  = pp_tree l ++ show (k,reverse vs) ++ "\n" ++ pp_tree r

{-
avAdd :: Ord a  =>  ATree a b -> 
                    a -> 
                    b -> 
                    ATree a b
-}
avAdd ALeaf xk xv = ABranch ALeaf xk [xv] ALeaf 1

avAdd (ABranch l yk yv r hy) xk xv
   | yk > xk = let (ABranch l1 zk zv l2 _) = avAdd l xk xv
               in avCombine l1 (f l1) l2 (f l2) r (f r) zk zv yk yv
   | xk > yk = let (ABranch r1 zk zv r2 _) = avAdd r xk xv
               in avCombine l (f l) r1 (f r1) r2 (f r2) yk yv zk zv
   | otherwise  = ABranch l yk (xv:yv) r hy
   where
      f :: ATree a b -> Int
      f ALeaf = 0
      f (ABranch _ _ _ _ d) = d
      


-- ==========================================================--
--
{-
avLookup :: Ord a  =>  ATree a b -> 
                       a -> 
                       Maybe b
-}
avLookup ALeaf _ = Nothing

avLookup (ABranch l k v r _) kk
   | kk < k     = avLookup l kk
   | kk > k     = avLookup r kk
   | otherwise  = Just v



-- ==========================================================--
--
avCombine :: ATree a b -> 
             Int -> 
             ATree a b -> 
             Int -> 
             ATree a b -> 
             Int -> 
             a -> 
             [b] -> 
             a -> 
             [b] -> 
             ATree a b

avCombine t1 h1 t2 h2 t3 h3 ak av ck cv
   | h2 > h1 && h2 > h3
      = ABranch (ABranch t1 ak av t21 (h1+1)) bk bv 
                (ABranch t22 ck cv t3 (h3+1)) (h1+2)
   | h1 >= h2 && h1 >= h3
      = ABranch t1 ak av (ABranch t2 ck cv t3 (max1 h2 h3)) 
                (max1 h1 (max1 h2 h3))
   | h3 >= h2 && h3 >= h1
      = ABranch (ABranch t1 ak av t2 (max1 h1 h2)) ck cv t3 
                (max1 (max1 h1 h2) h3)
   where
      (ABranch t21 bk bv t22 _) = t2
      max1 :: Int -> Int -> Int
      max1 n m = 1 + (if n > m then n else m)


-- ==========================================================--
-- === end                                     AVLTree.hs ===--
-- ==========================================================--




xref :: SymTable -> Int -> String -> SymTable

xref stab lineno [] = stab
xref stab lineno ('\n':cs) = xref stab (lineno+1) cs
xref stab lineno (c:cs) 
   = if isAlpha c then 
        let (word, rest) = span isAlphaNum cs
        in  xref (avAdd stab (c:word) lineno) lineno rest
     else xref stab lineno cs

main = do
    s <- getContents
    putStr (pp_tree (xref ALeaf 1 s))

{-
Date: Thu, 29 Oct 92 19:38:31 GMT
From: Julian Seward (DRL PhD) <sewardj@uk.ac.man.cs>
Message-Id: <9210291938.AA27685@r6b.cs.man.ac.uk>
To: partain@uk.ac.glasgow.dcs
Subject: More ghc vs hbc fiddling (OR: nofib ephemeral contribution (unsolicited :-))

Will,

There are still some very simple programs for which ghc's performance
falls far behind that of hbc's -- even with ghc using a better
GC.  The stat files below are from a 
crude cross reference program we hacked together for the purposes
of an internal "what-language-to-teach-first-year-undergrads" debate.

Is this something to do with dictionary zapping?

Program included below.  Use as a pipe.  Suggest you feed it any
large Haskell source file (I used TypeCheck5.hs from Anna).

Jules

---------------------------------------------------------

a.out -H9000000 -S 
Nw Heap Tt Heap   Stk    GC(real) GC acc (real)     tot (real) newheap    in -dupl  -new  -del  +stk   out  mcode
  99192   99192    20  0.06   0.1   0.06    0.1    0.16    0.4  396768     0     0     0     0     0     0
 247752  247752    14  0.13   0.1   0.19    0.2    0.44    0.8  991008     0     0     0     0     0     0
 623104  623104    34  0.32   0.3   0.51    0.5    1.08    1.5 2492416     0     0     0     0     0     0
1433968 1433968 15879  0.62   0.8   1.13    1.4    2.66    3.6 5735872     0     0     0     0     0     0
3009700 3009700  2382  1.56   1.6   2.69    3.0    6.88    8.6 9000000     0     0     0     0     0     0
         5 GCs,
      8.69 (13.1) seconds total time,
      2.69 (3.0) seconds GC time (31.0(23.1)% of total time)
      0.00 (0.0) seconds major GC time ( 0.0( 0.0)% of total time)
   9303816 bytes allocated from the heap.

------------------------------------------------

xref +RTS -H9M -S -K200k 

Collector: APPEL  HeapSize: 9,437,184 (bytes)

  Alloc   Live   Live   Astk   Bstk OldGen   GC    GC     TOT     TOT  Page Flts  Collec  Resid
  bytes   bytes    %   bytes  bytes  roots  user  elap    user    elap   GC  TOT   tion   %heap
4718580  786672  16.7     40    220    424  0.37  0.52    3.67    4.68    0    0   Minor
4325248  808804  18.7  62724  62820 564968  0.50  0.60    6.63    8.05    0    0   Minor
3920848  743508  19.0  47512  47600 743220  0.47  0.60    8.60   10.17    0    0   Minor
3549096  681464  19.2  34644  34892 680820  0.46  0.53   10.43   12.13    0    0   Minor
3208348  604892  18.9  23564  23676 604512  0.41  0.48   12.07   13.89    0    0   Minor
2905900  528584  18.2  14164  14396 527952  0.35  0.41   13.53   15.42    0    0   Minor
2641592  490812  18.6   5228   5388 490476  0.30  0.37   14.85   16.82    0    0   Minor
2396204  534400  22.3     16     40 534380  0.28  0.32   16.41   18.75    0    0   Minor
2129016  691708  32.5     36    144 691420  0.33  0.39   18.38   21.68    0    0   Minor
1090480

30,885,312 bytes allocated in the heap
         9 garbage collections performed

  Total time  19.29s  (23.06s elapsed)
  GC time      3.47s  (4.22s elapsed)
  %GC time    18.0%

--------------------------------------------------
-}