Я изучаю Хаскелл. Я заинтересован в том, чтобы использовать его для экспериментов с персональным компьютером. Прямо сейчас, я пытаюсь понять, как быстро Haskell может получить. Многие утверждают, что они связаны с C (++), и если это правда, я был бы очень доволен (я должен отметить, что я буду использовать Haskell, быстро или быстро, но быстро все-таки хорошо).
Моя тестовая программа реализует π (x) с помощью очень простого алгоритма: числа Primes добавляют к результату 1. Правые числа не имеют целочисленных делителей между 1 и √x. Это не битва алгоритмов, это чисто для производительности компилятора.
Haskell, кажется, примерно на 6x медленнее на моем компьютере, что хорошо (все же на 100 раз быстрее, чем чистый Python), но это может быть только потому, что я новичок Haskell.
Теперь, мой вопрос: Как, не изменяя алгоритм, могу ли я оптимизировать реализацию Haskell? Действительно ли Haskell по соотношению производительности с C?
Вот мой код Haskell
:
import System.Environment
-- a simple integer square root
isqrt :: Int -> Int
isqrt = floor . sqrt . fromIntegral
-- primality test
prime :: Int -> Bool
prime x = null [x | q <- [3, 5..isqrt x], rem x q == 0]
main = do
n <- fmap (read . head) getArgs
print $ length $ filter prime (2:[3, 5..n])
Вот мой код C++
:
#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;
bool isPrime(int);
int main(int argc, char* argv[]) {
int primes = 10000, count = 0;
if (argc > 1) {
primes = atoi(argv[1]);
}
if (isPrime(2)) {
count++;
}
for (int i = 3; i <= primes; i+=2) {
if (isPrime(i)){
count++;
}
}
cout << count << endl;
return 0;
}
bool isPrime(int x){
for (int i = 2; i <= floor(sqrt(x)); i++) {
if (x % i == 0) {
return false;
}
}
return true;
}