Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 哈斯凯尔向量机性能问题_Performance_Haskell_Vector_Primes_Sieve Of Eratosthenes - Fatal编程技术网

Performance 哈斯凯尔向量机性能问题

Performance 哈斯凯尔向量机性能问题,performance,haskell,vector,primes,sieve-of-eratosthenes,Performance,Haskell,Vector,Primes,Sieve Of Eratosthenes,我用C编写了经典的素数筛选算法,它几乎可以立即在我的机器上生成所有小于1000000的素数(我没有做任何优化) 在Haskell中,我使用了Ints的Vector,并为每个素数生成一个更新列表,该列表将倍数设置为零。这与我在C中使用嵌套的for循环时所做的基本相同: import qualified Data.Vector.Unboxed as U --| generate primes smaller than p sievePrimes :: Int -> U.Vector Int

我用C编写了经典的素数筛选算法,它几乎可以立即在我的机器上生成所有小于1000000的素数(我没有做任何优化)

在Haskell中,我使用了
Int
s的
Vector
,并为每个素数生成一个更新列表,该列表将倍数设置为零。这与我在C中使用嵌套的
for
循环时所做的基本相同:

import qualified Data.Vector.Unboxed as U

--| generate primes smaller than p
sievePrimes :: Int -> U.Vector Int
sievePrimes p = foldl f ns [0..p-1]
    where
        ns = U.fromList $ 0:[2..p]
        f v i
            | v U.! i == 0 = v
            | otherwise = v U.// [((i + 1)*k - 1, 0) | k <- [2..p `div` (i + 1)]]
import qualified Data.Vector.unbox为U
--|生成小于p的素数
SiveTime::Int->U.向量Int
sievePrimes p=foldl f ns[0..p-1]
哪里
ns=U.fromList$0:[2..p]
f v i
|v。!i==0=v

|否则=v U./[((i+1)*k-1,0)|k您需要将
foldl
调用替换为
foldl f ns[0..floor.sqrt.from integral$p]
。这从根本上提高了时间复杂度,如中所述,因为它不是
O(n)
因为它是在具有破坏性更新的语言中出现的
,比如C;这就是为什么不尽快停止不会恶化时间复杂性的原因

但在Haskell中,必须尽快停止使用不可变数据,因为更新操作的时间复杂度更差,列表和向量也是如此

在分析一段代码的性能时,始终通过在几个问题大小点测量其速度并计算
logBase(n2/n1)(t2/t1)
来分析其性能

更新后的代码在我的计算机上用GHCi解释,在3.53秒内生成
n=78498
以下
n=1000000
的素数,运行速度为~n1.1或~n1.2,非常不错


您的代码以~N
N=40000/20000
计算,运行速度为~N1.7或~N1.9,速度非常慢;如果复杂性保持不变,预计运行时间为1000000是7分钟。

关于Haskell中素数生成的问题非常多。您是否在询问之前进行了搜索?如果是,pl请花一些时间来概述其他问题没有很好涵盖的内容。如果没有…没有时间像现在这样!无意冒犯,但链接的问题似乎基本相同,并且有一个出色的答案-连同rampion的链接文章,您应该很好去-如果没有,请咨询cf..更有效的是使用mu表数组,如中所示。CodeReview上的某个地方有一个Daniel Fischer的版本,它使用循环而不是
forM
,并且
unsafeWrite
,运行速度要快得多。否则,请查阅
arithmoi
包。为您找到它:;它的w/赔率仅数组版本,始终比a.慢1.6倍总体上,我们有SturStar(unSuffRead,Road),SturARCd(写入,Read),UARSULL(分段)uURAL(连续累积数组)的速度比,C++ C++作为代码> 1.6x 4.4.x×9.6x 11xx13x。