Performance 列表理解中的绩效(处理时间)影响因素是什么?

Performance 列表理解中的绩效(处理时间)影响因素是什么?,performance,haskell,functional-programming,Performance,Haskell,Functional Programming,在学习learn-you-a-haskell的例子时,“哪个直角三角形 所有边和小于等于10的所有边的整数周长为24?“ rightTrianglesOriginal=[(a,b,c)| cb?] 在谓词(1)a>b和(2)c>a的基础上列出元组,然后进一步应用a^2+b^2=c^2是否会提高总体性能 如果我们更改参数位置,例如(a、b、c)或(c、b、a),是否会对性能产生影响 如果需要这种大量的排列和组合,那么在实际应用中,什么是可取的策略?我们是否应该存储预先计算的答案(尽可能)以供下次使

在学习learn-you-a-haskell的例子时,“哪个直角三角形 所有边和小于等于10的所有边的整数周长为24?“

rightTrianglesOriginal=[(a,b,c)| cb?]

  • 在谓词(1)a>b和(2)c>a的基础上列出元组,然后进一步应用a^2+b^2=c^2是否会提高总体性能

  • 如果我们更改参数位置,例如(a、b、c)或(c、b、a),是否会对性能产生影响

  • 如果需要这种大量的排列和组合,那么在实际应用中,什么是可取的策略?我们是否应该存储预先计算的答案(尽可能)以供下次使用,以提高性能或任何其他性能

  • 右三角形=[(a,b,c)| c 但是整个计算非常小,因此很难进行可靠的测量。一般来说,通过重新排序测试和生成器可以获得很大的差异,特别是交错测试和生成器到捷径死胡同会产生巨大的影响。在这里,您可以在
    b
    a
    之间添加一个
    b
    测试将生成器更改为快捷方式。当然,是否将生成器更改为
    b,c>a,c>b
    ?) 是的,但通常很少,除非谓词的计算成本非常高。在上述情况下,如果谓词保持不变,则会对隐含的第三个谓词进行不必要的计算。在这里,对于标准数字类型,谓词的计算成本很低,并且不会经常进行计算(大多数候选三元组都会更早失败),因此影响很难测量。但这是额外的工作要做-编译器没有足够的智能来消除它-因此它需要额外的时间

    • 在谓词(1)
      a>b
      和(2)
      c>a
      的基础上列出元组,然后进一步应用a^2+b^2=c^2是否会提高总体性能
    这要看情况而定。如果将谓词放在可以缩短的位置,这将提高性能。使用这些谓词,将需要对生成器重新排序(在
    b
    之前获取
    a
    ,这样您就可以缩短
    c>a
    )。比较的计算成本也比
    A^2+b^2==c^2
    要低一些,因此即使测试的总数增加(后一种情况比前一种情况省去了更多的三倍),也可以先进行更便宜的测试来提高性能(但首先进行最具辨别力的测试也可能是更好的策略,即使测试成本更高,这取决于成本和功耗之间的关系)

    • 如果我们更改参数位置,例如
      (a,b,c)
      (c,b,a)
      ,是否会对性能产生影响
    基本上,这不会产生任何可测量的影响

    • 如果需要大量的排列和组合,那么在实际应用中,什么是可取的策略?我们是否应该存储预先计算的答案(尽可能)以供下次使用,以提高性能或其他用途
    这要视情况而定。如果计算复杂且结果很小,则最好存储结果以供重用。如果计算便宜且结果大,则最好重新计算。在这种情况下,毕达哥拉斯三元组的数量很小且计算成本不太低,因此存储以供重用可能是有益的

    rightTriangles10 = [ (a,b,c) | c <- [1..10], b <- [1..10], a <- [1..10], a^2 + b^2 == c^2, a > b , c > a]
    

    rightTriangles10=[(a,b,c)| c当我运行函数时,我没有得到这个“(2.64秒,2012018624字节)。如何获得处理时间?字节值代表什么?目前,我使用的是“WinGHCi 1.0.6)。请注意,所用的时间与您提到的差不多。我将更正问题中的错误。在ghci中,在提示符处键入
    :set+s
    ,以获取时间统计信息。字节值度量分配,但我不确定具体内容以及它是否有用。对于任何重要的度量,无论如何都应使用优化进行编译。
    rightTrianglesSwapped = [ (a,b,c) | c <- [1..10], b <- [1..10], a <- [1..10], a+b+c == 24, a^2 + b^2 == c^2]
    
    rightTriangles10 = [ (a,b,c) | c <- [1..10], b <- [1..10], a <- [1..10], a^2 + b^2 == c^2, a > b , c > a]
    
    rightTriangles100 = [ (a,b,c) | c <- [1..100], b <- [1..100], a <- [1..100], a^2 + b^2 == c^2, a > b , c > a]
    
    rightTriangles1000 = [ (a,b,c) | c <- [1..1000], b <- [1..1000], a <- [1..1000], a^2 + b^2 == c^2, a > b , c > a]
    
    ghci> [ (a,b,c) | c <- [1..100], b <- [1..100], a <- [1..100], a^2 + b^2 == c^2, a > b , c > a]
    [(4,3,5),(8,6,10),(12,5,13),(12,9,15),(15,8,17),(16,12,20),(24,7,25),(20,15,25),(24,10,26)
    ,(21,20,29),(24,18,30),(30,16,34),(28,21,35),(35,12,37),(36,15,39),(32,24,40),(40,9,41)
    ,(36,27,45),(48,14,50),(40,30,50),(45,24,51),(48,20,52),(45,28,53),(44,33,55),(42,40,58)
    ,(48,36,60),(60,11,61),(63,16,65),(60,25,65),(56,33,65),(52,39,65),(60,32,68),(56,42,70)
    ,(55,48,73),(70,24,74),(72,21,75),(60,45,75),(72,30,78),(64,48,80),(80,18,82),(84,13,85)
    ,(77,36,85),(75,40,85),(68,51,85),(63,60,87),(80,39,89),(72,54,90),(84,35,91),(76,57,95)
    ,(72,65,97),(96,28,100),(80,60,100)]
    (2.64 secs, 2012018624 bytes)
    
    ghci> length [(a,b,c) | c <- [2 .. 1000], b <- [1 .. c-1], a <- [c-b+1 .. b], a*a + b*b == c*c]
    881
    (87.28 secs, 26144152480 bytes)