File: fib_smlsharp_thread.sml

package info (click to toggle)
smlsharp 4.2.0-1~exp1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 125,348 kB
  • sloc: ansic: 16,737; sh: 4,347; makefile: 2,228; java: 742; haskell: 493; ruby: 305; cpp: 284; pascal: 256; ml: 255; lisp: 141; asm: 97; sql: 74
file content (35 lines) | stat: -rw-r--r-- 1,074 bytes parent folder | download | duplicates (3)
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
val args = CommandLine.arguments ()
val repeat = case args of s::_ => valOf (Int.fromString s) | _ => 10
val size = case args of _::s::_ => valOf (Int.fromString s) | _ => 40
val cutOff = case args of _::_::s::_ => valOf (Int.fromString s) | _ => 10

fun fib 0 = 0
  | fib 1 = 1
  | fib n = fib (n - 1) + fib (n - 2)

fun pfib n =
    if n <= cutOff
    then fib n
    else let val t = Thread.create (fn () => pfib (n - 2))
         in pfib (n - 1) + Thread.join t
         end

fun doit () = pfib size

fun rep 0 = ()
  | rep n =
    let val t1 = Time.now ()
        val r = doit ()
        val t2 = Time.now ()
        (* val _ = print (Int.toString r ^ "\n") *)
        val d1 = Time.toReal t1
        val d2 = Time.toReal t2
    in (_import "printf" : (string,...(int,real)) -> int)
         (" - {result: %d, time: %.6f}\n", r, d2 - d1);
       rep (n - 1)
    end

val _ = (_import "printf" : (string,...(string,int,int)) -> int)
          (" bench: fib_smlsharp_%s\n size: %d\n cutoff: %d\n results:\n",
           Thread.threadtype, size, cutOff)
val _ = rep repeat