root/trunk/benchmark/fasta.md

Revision 362, 2.9 kB (checked in by JarrettBillingsley, 3 months ago)

Fixed a bug where array data was being allocated but not initialized, causing some GC cycles to try to scan garbage data (and crash). Updated the benchmarks and all that I've tested have worked fine, not to mention being at least 15% faster in most cases :)

Line 
1 module benchmark.fasta
2
3 // laptop: n = 25,000,000, 860 sec
4
5 local IM = 139968
6 local IA = 3877
7 local IC = 29573
8 local Last = 42.0
9
10 local write = write
11 local writeln = writeln
12
13 local function random(max)
14 {
15     local y = (Last * IA + IC) % IM
16     Last = y
17     return (max * y) / IM
18 }
19
20 local function makeCumulative(arr)
21 {
22     local sum = 0.0
23
24     for(i: 0 .. #arr)
25     {
26         sum += arr[i][1]
27         arr[i][1] = sum
28     }
29
30     return arr
31 }
32
33 local function selectRandom(arr)
34 {
35     local r = random(1.0)
36
37     if(r < arr[0][1])
38         return arr[0][0]
39
40     local lo = 0
41     local hi = #arr - 1
42
43     while(hi > lo + 1)
44     {
45         local i = (hi + lo) / 2
46
47         if(r < arr[i][1])
48             hi = i
49         else
50             lo = i
51     }
52
53     return arr[hi][0]
54 }
55
56 local function makeRepeatFasta(id, desc, s, n)
57 {
58     writefln(">{} {}", id, desc)
59
60     local p = 0
61     local sn = #s
62     local s2 = s ~ s
63
64     for(i : 60 .. n + 1, 60)
65     {
66         writeln(s2[p .. p + 60])
67         p += 60
68
69         if(p > sn)
70             p -= sn
71     }
72
73     local tail = n % 60
74
75     if(tail > 0)
76         writeln(s2[p .. p + tail])
77 }
78
79 local function makeRandomFasta(id, desc, arr, n)
80 {
81     writefln(">{} {}", id, desc)
82
83     local f = selectRandom
84
85     for(i : 60 .. n + 1, 60)
86     {
87         writeln(
88             f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr),
89             f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr),
90             f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr),
91             f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr),
92             f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr),
93             f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), f(arr), (f(arr))
94         )
95     }
96
97     local tail = n % 60
98
99     if(tail > 0)
100     {
101         for(j : 0 .. tail)
102             write((f(arr)))
103
104         writeln()
105     }
106 }
107
108 local alu =
109     "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG" ~
110     "GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA" ~
111     "CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT" ~
112     "ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA" ~
113     "GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG" ~
114     "AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC" ~
115     "AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"
116
117 local iub = makeCumulative([
118     [ "a", 0.27 ],
119     [ "c", 0.12 ],
120     [ "g", 0.12 ],
121     [ "t", 0.27 ],
122     [ "B", 0.02 ],
123     [ "D", 0.02 ],
124     [ "H", 0.02 ],
125     [ "K", 0.02 ],
126     [ "M", 0.02 ],
127     [ "N", 0.02 ],
128     [ "R", 0.02 ],
129     [ "S", 0.02 ],
130     [ "V", 0.02 ],
131     [ "W", 0.02 ],
132     [ "Y", 0.02 ]
133 ])
134
135 local homosapiens = makeCumulative([
136     [ "a", 0.3029549426680 ],
137     [ "c", 0.1979883004921 ],
138     [ "g", 0.1975473066391 ],
139     [ "t", 0.3015094502008 ]
140 ])
141
142 function main(N)
143 {
144     local n = 25_000_000
145
146     if(isString(N))
147         try n = toInt(N); catch(e) {}
148
149     local timer = time.PerfCounter.clone()
150     timer.start()
151
152         makeRepeatFasta("ONE", "Homo sapiens alu", alu, n * 2)
153         makeRandomFasta("TWO", "IUB ambiguity codes", iub, n * 3)
154         makeRandomFasta("THREE", "Homo sapiens frequency", homosapiens, n * 5)
155    
156     timer.stop()
157     writefln("Took {} sec", timer.seconds())
158 }
Note: See TracBrowser for help on using the browser.