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 wanp...@gmail.com <wanp...@gmail.com> > 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 racket-users...@googlegroups.com. > > 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 racket-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/e7d0d239-1b36-4e7d-a93d-7dbdfcbcc04en%40googlegroups.com.