埃拉托色尼筛法执行时间 haskell

Sieve of Eratosthenes execution time in haskell

我是 Haskell 的新手,正在编写使用列表解决埃拉托色尼筛法问题的代码。这是代码

primes m = 2 : primes' m [3,5 ..m] [] where
primes' m integers@(p : xs) acc   | p*p>m =  reverse acc ++ integers
                                  | True  = primes' m (xs `remove` [p*p, p*p+2*p..m]) (p:acc)

remove integers@(x:xs) multiples@(y:ys) | x < y = x : remove xs multiples
                                        | x == y =    remove xs ys
                                        | x > y =     remove integers ys

remove integers multiples = integers

如果我输入 m = 2000000,代码大约需要 14 秒才能打印出所有结果。我认为 90% 的时间用于打印而不是实际执行代码。有没有办法找到这个特定程序的正确执行时间?

试试

main = print $ last $ primes 2000000

所以它只会显示最后找到的素数。

使用 -O2 编译它,使用 +RTS -s 运行 编译它以查看整体时间和内存统计信息。

一定要测量几个尺寸点,找出empirical orders of growth!真筛 运行 大约 ~ n^1.1,在 n 个素数中产生。 ~ n^1.5 以内的都可以。 ~ n^2 不好,比这更慢更糟。 :)

你的应该没问题,看样子。