case Suspend
(k
) => k
().
run }
}
def normal
(n
: Int
) : Int
=
def cps
(n
: Int
) : Int
= { def loop
(i
: Int, k
: Int
=> TailRec
[Int
]) : TailRec
[Int
] = else loop
(i -
1, x
=> Suspend
(() => k
(1 + x
)))
loop(n, t => Return(t)).run
}
def accum
(n
: Int
) : Int
= { def loop
(i
: Int, a
: Int
) : Int
=
loop(n, 0)
}
def main
(args
: Array
[String
]) : Unit
= { val s1
= System.
currentTimeMillis() accum(n)
println(System.currentTimeMillis() - s1)
val s2
= System.
currentTimeMillis() cps(n)
println(System.currentTimeMillis() - s2)
val s3
= System.
currentTimeMillis() normal(n)
println(System.currentTimeMillis() - s3)
}
}
c2VhbGVkIHRyYWl0IFRhaWxSZWNbQV0gewogIGZpbmFsIGRlZiBydW4gOiBBID0gdGhpcyBtYXRjaCB7CiAgICBjYXNlIFJldHVybih2KSAgPT4gdgogICAgY2FzZSBTdXNwZW5kKGspID0+IGsoKS5ydW4KICB9Cn0KCmNhc2UgY2xhc3MgUmV0dXJuW0FdKHYgOiBBKSBleHRlbmRzIFRhaWxSZWNbQV0KY2FzZSBjbGFzcyBTdXNwZW5kW0FdKHJlc3VtZSA6ICgpID0+IFRhaWxSZWNbQV0pIGV4dGVuZHMgVGFpbFJlY1tBXQoKb2JqZWN0IE1haW4gewogIGRlZiBub3JtYWwgKG4gOiBJbnQpIDogSW50ID0KICAgIGlmIChuID09IDApIDAKICAgIGVsc2UgMSArIG5vcm1hbChuIC0gMSkKIAogIGRlZiBjcHMgKG4gOiBJbnQpIDogSW50ID0gewogICAgZGVmIGxvb3AgKGkgOiBJbnQsIGsgOiBJbnQgPT4gVGFpbFJlY1tJbnRdKSA6IFRhaWxSZWNbSW50XSA9CiAgICAgIGlmIChpID09IDApIGsoMCkKICAgICAgZWxzZSBsb29wKGkgLSAxLCB4ID0+IFN1c3BlbmQoKCkgPT4gaygxICsgeCkpKQogCiAgICBsb29wKG4sIHQgPT4gUmV0dXJuKHQpKS5ydW4KICB9CiAKICBkZWYgYWNjdW0gKG4gOiBJbnQpIDogSW50ID0gewogICAgZGVmIGxvb3AgKGkgOiBJbnQsIGEgOiBJbnQpIDogSW50ID0KICAgICAgaWYgKGkgPT0gMCkgYQogICAgICBlbHNlIGxvb3AoaSAtIDEsIGEgKyAxKQogCiAgICBsb29wKG4sIDApCiAgfQogCiAgZGVmIG1haW4oYXJncyA6IEFycmF5W1N0cmluZ10pIDogVW5pdCA9IHsKICAgIHZhbCBuID0gMTAwCiAgICB2YWwgczEgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKQogICAgYWNjdW0obikKICAgIHByaW50bG4oU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBzMSkKIAogICAgdmFsIHMyID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkKICAgIGNwcyhuKQogICAgcHJpbnRsbihTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHMyKQogCiAgICB2YWwgczMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKQogICAgbm9ybWFsKG4pCiAgICBwcmludGxuKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gczMpCiAgfQp9