相关疑难解决方法(0)

与Project Euler的速度比较:C vs Python vs Erlang vs Haskell

我已经采取了问题#12项目欧拉作为编程练习和我的(肯定不是最优的)实现在C,Python和Erlang和Haskell的比较.为了获得更高的执行时间,我搜索第一个三角形数字,其中有超过1000个除数而不是原始问题中所述的500.

结果如下:

C:

lorenzo@enzo:~/erlang$ gcc -lm -o euler12.bin euler12.c
lorenzo@enzo:~/erlang$ time ./euler12.bin
842161320

real    0m11.074s
user    0m11.070s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud)

蟒蛇:

lorenzo@enzo:~/erlang$ time ./euler12.py 
842161320

real    1m16.632s
user    1m16.370s
sys 0m0.250s
Run Code Online (Sandbox Code Playgroud)

Python与PyPy:

lorenzo@enzo:~/Downloads/pypy-c-jit-43780-b590cf6de419-linux64/bin$ time ./pypy /home/lorenzo/erlang/euler12.py 
842161320

real    0m13.082s
user    0m13.050s
sys 0m0.020s
Run Code Online (Sandbox Code Playgroud)

二郎:

lorenzo@enzo:~/erlang$ erlc euler12.erl 
lorenzo@enzo:~/erlang$ time erl -s euler12 solve
Erlang R13B03 (erts-5.7.4) [source] [64-bit] [smp:4:4] [rq:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.7.4  (abort with ^G)
1> 842161320

real    0m48.259s
user    0m48.070s
sys 0m0.020s
Run Code Online (Sandbox Code Playgroud)

哈斯克尔: …

c python erlang performance haskell

645
推荐指数
14
解决办法
13万
查看次数

为什么Prelude的单词功能不是更简单?

考虑wordsPrelude功能; 它非常简单,可以用以下方式编写它:

words' :: String -> [String]
words' [] = []
words' str = before : words' (dropWhile isSpace after) where
    (before, after) = break isSpace str
Run Code Online (Sandbox Code Playgroud)

但是,我注意到它的原始Prelude代码似乎更少......自然:

words                   :: String -> [String]
words s                 =  case dropWhile {-partain:Char.-}isSpace s of
                                "" -> []
                                s' -> w : words s''
                                      where (w, s'') =
                                             break {-partain:Char.-}isSpace s'
Run Code Online (Sandbox Code Playgroud)

我假设有与优化相关的原因.问题是:我错误地认为编译器应该words'像Prelude版本一样优化函数吗?我没有使用相同的功能(break,dropWhile,isSpace).

我曾经非常惊讶GHC没有执行一些最简单的低级优化:

C vs Haskell Collat​​z猜想速度比较

但除了这些{-partain:Char.-}位(这种情况下编译器的提示在IMO这种情况下似乎没有用),words代码似乎对于高级语言来说是不必要的.在这种情况下,它背后的原因是什么?

compiler-construction optimization haskell

14
推荐指数
1
解决办法
783
查看次数

GHC优化:Collat​​z猜想

我在HaskellC++(ideone链接)中编写了Project Euler挑战14的代码.他们都记得以前在数组中做过的任何计算.

分别使用ghc -O2g++ -O3运行C++的速度比Haskell版本快10-15倍.

虽然我理解Haskell版本可能运行速度较慢,并且Haskell是一种更好的语言,但我很高兴知道我可以对Haskell版本进行一些代码更改以使其运行得更快(理想情况下在2或2之内) 3个C++版本)?


Haskell代码在这里:

import Data.Array
import Data.Word
import Data.List

collatz_array = 
  let
    upperbound = 1000000
    a = array (1, upperbound) [(i :: Word64, f i :: Int) | i <- [1..upperbound]]
    f i = i `seq`
      let
        check_f i = i `seq` if i <= upperbound then a ! i else f i
      in
        if (i == 1) then 0 else (check_f ((if (even i) …
Run Code Online (Sandbox Code Playgroud)

optimization haskell

12
推荐指数
1
解决办法
1143
查看次数

使Haskell代码更快

有谁知道如何使这个Haskell代码更快乐?我在做Euler项目#14.此代码在4.029秒内运行:

collatz :: Int -> Int64 -> Int                                                                                                                                                 
collatz c 1 = c                                                                 
collatz c k                                                                     
    | even k    = collatz (c+1) (k `div` 2)                                     
    | otherwise = collatz (c+1) (3*k + 1)                                       

main = do                    
    print $ maximum (map (\i -> (collatz 1 i, i)) [1..1000000])
Run Code Online (Sandbox Code Playgroud)

记住collat​​z函数实际上会增加运行时间,所以我没有做任何memoization.可比的C代码在0.239秒内运行:

int main(int argc, char *argv[])
{
    int maxlength = 0;
    int maxstart = 1;
    for (int i = 1; i <= 1000000; i++) {
        unsigned long k = i;
        int …
Run Code Online (Sandbox Code Playgroud)

haskell

1
推荐指数
1
解决办法
212
查看次数