У меня есть этот файл haskell, скомпилированный с ghc -O2
(ghc 7.4.1) и занимает 1,65 секунды на моей машине.
import Data.Bits
main = do
print $ length $ filter (\i -> i .&. (shift 1 (i `mod` 4)) /= 0) [0..123456789]
Тот же алгоритм в C, скомпилированный с помощью gcc -O2
(gcc 4.6.3), выполняется через 0,18 с.
#include <stdio.h>
void main() {
int count = 0;
const int max = 123456789;
int i;
for (i = 0; i < max; ++i)
if ((i & (1 << i % 4)) != 0)
++count;
printf("count: %d\n", count);
}
Обновление
Я думал, что это может быть медленный процесс Data.Bits
, но удивительно, если я удалю сдвиг и просто сделаю прямую mod
, она на самом деле работает медленнее на 5,6 секунды!?!
import Data.Bits
main = do
print $ length $ filter (\i -> (i `mod` 4) /= 0) [0..123456789]
тогда как эквивалент C работает немного быстрее на 0,16 с:
#include <stdio.h>
void main() {
int count = 0;
const int max = 123456789;
int i;
for (i = 0; i < max; ++i)
if ((i % 4) != 0)
++count;
printf("count: %d\n", count);
}