1. (use extras)
  2. (use srfi-69)
  3. (define maxc 100000)
  4. (define maxran 100000)
  5. (time
  6. (let loop ((count maxc) (n (random maxran)) (alist (list)))
  7. (if (> count 0)
  8. (loop (- count 1)
  9. (random maxran)
  10. (if (alist-ref n alist)
  11. (alist-update n (+ (alist-ref n alist) 1) alist)
  12. (alist-update n 1 alist))))))
  13. (time
  14. (let loop ((count maxc) (n (random maxran)) (alist (list)))
  15. (if (> count 0)
  16. (begin
  17. (if (alist-ref n alist)
  18. (alist-update! n (+ (alist-ref n alist) 1) alist)
  19. (alist-update! n 1 alist))
  20. (loop (- count 1) (random maxran) alist)))))
  21. (time
  22. (let loop ((count maxc) (n (random maxran)) (alist (make-hash-table)))
  23. (if (> count 0)
  24. (begin
  25. (if (hash-table-exists? alist n)
  26. (hash-table-set! alist n (+ (hash-table-ref alist n) 1))
  27. (hash-table-set! alist n 1))
  28. (loop (- count 1) (random maxran) alist)))))
  29. (time
  30. (let loop ((count maxc) (n (random maxran)) (alist (make-hash-table)))
  31. (if (> count 0)
  32. (begin
  33. (hash-table-set! alist n (+ (hash-table-ref/default alist n 0) 1))
  34. (loop (- count 1) (random maxran) alist)))))
  35. ;650.477s CPU time, 381.043s GC time (major), 232987/813312 GCs (major/minor)
  36. ;0.014s CPU time, 0/171 GCs (major/minor)
  37. ;0.112s CPU time, 0.009s GC time (major), 142497 mutations, 5/719 GCs (major/minor)
  38. ;0.107s CPU time, 0.011s GC time (major), 142534 mutations, 3/640 GCs (major/minor)