[Haskell-beginners] vector indexing time

Alexander Dunlap alexander.dunlap at gmail.com
Fri Aug 3 05:13:47 CEST 2012


On 2 August 2012 19:45, Ivan Vyalov <VyalovIvan at yandex.ru> wrote:
> Hi everyone!
>
> I have a question about time complexity of vector indexing. Obviously, it should be constant, but if I do the following naive tests it looks linear. What do I do wrong?
>
>
> Ivan
>
>
> $ for i in 10000000 20000000 40000000 80000000 ; do cat vec_in_"$i".hs; ghc -fforce-recomp -O2 --make vec_in_"$i".hs && time ./vec_in_"$i"; done
> import Data.Vector.Unboxed
> main = do
>     let a = enumFromN 1 100000001 :: Vector Int
>     print $ a ! 10000000
>
> [1 of 1] Compiling Main             ( vec_in_10000000.hs, vec_in_10000000.o )
> Linking vec_in_10000000 ...
> 10000001
>
> real    0m0.033s
> user    0m0.032s
> sys     0m0.000s
> import Data.Vector.Unboxed
> main = do
>     let a = enumFromN 1 100000001 :: Vector Int
>     print $ a ! 20000000
>
> [1 of 1] Compiling Main             ( vec_in_20000000.hs, vec_in_20000000.o )
> Linking vec_in_20000000 ...
> 20000001
>
> real    0m0.062s
> user    0m0.060s
> sys     0m0.000s
> import Data.Vector.Unboxed
> main = do
>     let a = enumFromN 1 100000001 :: Vector Int
>     print $ a ! 40000000
>
> [1 of 1] Compiling Main             ( vec_in_40000000.hs, vec_in_40000000.o )
> Linking vec_in_40000000 ...
> 40000001
>
> real    0m0.125s
> user    0m0.120s
> sys     0m0.004s
> import Data.Vector.Unboxed
> main = do
>     let a = enumFromN 1 100000001 :: Vector Int
>     print $ a ! 80000000
>
> [1 of 1] Compiling Main             ( vec_in_80000000.hs, vec_in_80000000.o )
> Linking vec_in_80000000 ...
> 80000001
>
> real    0m0.244s
> user    0m0.240s
> sys     0m0.000s
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners

I'm no expert, but I suspect it has something to do with stream fusion
and the entire vector thus not being generated when you only ask for
an early element. The time difference went away when I modified your
code to also print the length of the vector. Also, when I compiled
without optimization, there were only negligible differences between
the different runs.

Alex

$ for i in 10000000 20000000 40000000 80000000 ; do cat
vec_in_"$i".hs; ghc -fforce-recomp -O2 --make vec_in_"$i".hs && time
./vec_in_"$i"; done
import Data.Vector.Unboxed
main = do
    let a = enumFromN 1 100000001 :: Vector Int
    print $ Data.Vector.Unboxed.length a
    print $ a ! 10000000
[1 of 1] Compiling Main             ( vec_in_10000000.hs, vec_in_10000000.o )
Linking vec_in_10000000 ...
100000001
10000001

real    0m0.323s
user    0m0.100s
sys     0m0.220s
import Data.Vector.Unboxed
main = do
    let a = enumFromN 1 100000001 :: Vector Int
    print $ Data.Vector.Unboxed.length a
    print $ a ! 20000000
[1 of 1] Compiling Main             ( vec_in_20000000.hs, vec_in_20000000.o )
Linking vec_in_20000000 ...
100000001
20000001

real    0m0.323s
user    0m0.130s
sys     0m0.190s
import Data.Vector.Unboxed
main = do
    let a = enumFromN 1 100000001 :: Vector Int
    print $ Data.Vector.Unboxed.length a
    print $ a ! 40000000
[1 of 1] Compiling Main             ( vec_in_40000000.hs, vec_in_40000000.o )
Linking vec_in_40000000 ...
100000001
40000001

real    0m0.317s
user    0m0.117s
sys     0m0.197s
import Data.Vector.Unboxed
main = do
    let a = enumFromN 1 100000001 :: Vector Int
    print $ Data.Vector.Unboxed.length a
    print $ a ! 80000000
[1 of 1] Compiling Main             ( vec_in_80000000.hs, vec_in_80000000.o )
Linking vec_in_80000000 ...
100000001
80000001

real    0m0.329s
user    0m0.133s
sys     0m0.193s



More information about the Beginners mailing list