Thanks, that make sense! One more thing which bothers me is if I put a (collect-garbage) in front of the testing, I got gc time: 0 if not I got gc time: 9. Why can't 1 gc reclaim all memory during execution while it can before executes?
Sam Tobin-Hochstadt 在 2020年8月5日 星期三下午11:44:21 [UTC+8] 的信中寫道: > What's happening here is that your function takes effectively 0 time, > but when you ran the first version, there was a GC pause during it > (that's why there's the "gc time: 9" there). GC pauses can happen at > any time, basically, so it's not something about what your function is > doing. > > Here's a benchmark of your two functions that takes long enough to run > that it avoids some of these issues, and also runs a GC before > benchmarking: https://gist.github.com/7cb4645308d8572e2250833ef7b90b7c > > On my machine, I get 40 ms for version 1, and 100 ms for version 2, as > you expected. > > Sam > > On Wed, Aug 5, 2020 at 11:21 AM [email protected] <[email protected]> > wrote: > > > > I was working on a exercism problem named Raindrops. > > > > Problem description: > > Convert a number to a string, the contents of which depend on the > number's factors. > > > > If the number has 3 as a factor, output 'Pling'. > > If the number has 5 as a factor, output 'Plang'. > > If the number has 7 as a factor, output 'Plong'. > > If the number does not have 3, 5, or 7 as a factor, just pass the > number's digits straight through. > > > > I came out with two version. > > > > ; version 1 > > (define (convert n) > > (define pling (divides? 3 n)) > > (define plang (divides? 5 n)) > > (define plong (divides? 7 n)) > > (if (or pling plang plong) > > (string-append (if pling "Pling" "") > > (if plang "Plang" "") > > (if plong "Plong" "")) > > (number->string n))) > > > > ; version 2 > > (define (convert n) > > (define table '((3 . "Pling") (5 . "Plang") (7 . "Plong"))) > > (define result (for/list ([(k v) (in-dict table)] #:when (divides? k n)) > v)) > > (if (empty? result) (number->string n) > > (string-append* result))) > > > > (require math/number-theory) > > > > I thought version 1 would be faster, but it turned out to be wrong. > Running with raco test got following timing information. > > > > version 1 > > cpu time: 9 real time: 9 gc time: 9 > > version 2 > > cpu time: 0 real time: 0 gc time: 0 > > > > Then I ran both version in DrRacket, both output following result. > > cpu time: 0 real time: 0 gc time: 0 > > > > It's strange, isn't it? > > > > -- > > You received this message because you are subscribed to the Google > Groups "Racket Users" group. > > To unsubscribe from this group and stop receiving emails from it, send > an email to [email protected]. > > To view this discussion on the web visit > https://groups.google.com/d/msgid/racket-users/46592171-c357-4897-af1a-bea91c838cacn%40googlegroups.com. > > > -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/e7d0d239-1b36-4e7d-a93d-7dbdfcbcc04en%40googlegroups.com.

