diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+1.4.9
+
+* Implement `vector` utility more efficiently
+
 1.4.8
 
 * Only depend on `semigroups` for older GHC versions
diff --git a/foldl.cabal b/foldl.cabal
--- a/foldl.cabal
+++ b/foldl.cabal
@@ -1,5 +1,5 @@
 Name: foldl
-Version: 1.4.8
+Version: 1.4.9
 Cabal-Version: >=1.10
 Build-Type: Simple
 License: BSD3
@@ -26,7 +26,7 @@
     Build-Depends:
         base         >= 4.8      && < 5   ,
         bytestring   >= 0.9.2.1  && < 0.11,
-        mwc-random   >= 0.13.1.0 && < 0.15,
+        mwc-random   >= 0.13.1.0 && < 0.16,
         primitive                   < 0.8 ,
         text         >= 0.11.2.0 && < 1.3 ,
         transformers >= 0.2.0.0  && < 0.6 ,
@@ -37,8 +37,7 @@
         contravariant               < 1.6 ,
         profunctors                 < 5.6 ,
         semigroupoids >= 1.0     && < 5.4 ,
-        comonad      >= 4.0      && < 6   ,
-        vector-builder              < 0.4
+        comonad      >= 4.0      && < 6
     if impl(ghc < 8.0)
         Build-Depends:
             semigroups   >= 0.17 && < 1.20
@@ -50,6 +49,8 @@
     Other-Modules:
         Control.Foldl.Optics
         Control.Foldl.Internal
+        Control.Foldl.Util.Vector
+        Control.Foldl.Util.MVector
     GHC-Options: -O2 -Wall
     Default-Language: Haskell2010
 
diff --git a/src/Control/Foldl.hs b/src/Control/Foldl.hs
--- a/src/Control/Foldl.hs
+++ b/src/Control/Foldl.hs
@@ -197,9 +197,8 @@
 import qualified Data.HashMap.Strict         as HashMap
 import qualified Data.HashSet                as HashSet
 import qualified Data.Vector.Generic         as V
+import qualified Control.Foldl.Util.Vector   as V
 import qualified Data.Vector.Generic.Mutable as M
-import qualified VectorBuilder.Builder
-import qualified VectorBuilder.Vector
 import qualified Data.Semigroupoid
 
 {- $setup
@@ -1000,13 +999,7 @@
 
 -- | Fold all values into a vector
 vector :: Vector v a => Fold a (v a)
-vector = Fold step begin done
-  where
-    begin = VectorBuilder.Builder.empty
-
-    step x a = x <> VectorBuilder.Builder.singleton a
-
-    done = VectorBuilder.Vector.build
+vector = V.fromReverseListN <$> length <*> revList
 {-# INLINABLE vector #-}
 
 maxChunkSize :: Int
diff --git a/src/Control/Foldl/Util/MVector.hs b/src/Control/Foldl/Util/MVector.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Foldl/Util/MVector.hs
@@ -0,0 +1,17 @@
+{-# LANGUAGE BangPatterns #-}
+module Control.Foldl.Util.MVector
+where
+
+import Data.Vector.Generic.Mutable
+import Control.Monad.ST
+
+
+{-# INLINE writeListInReverseOrderStartingFrom #-}
+writeListInReverseOrderStartingFrom :: MVector v a => v s a -> Int -> [a] -> ST s ()
+writeListInReverseOrderStartingFrom v = let
+  loop !index list = case list of
+    h : t -> do
+      unsafeWrite v index h
+      loop (pred index) t
+    _ -> return ()
+  in loop
diff --git a/src/Control/Foldl/Util/Vector.hs b/src/Control/Foldl/Util/Vector.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Foldl/Util/Vector.hs
@@ -0,0 +1,27 @@
+{-|
+General utilities for immutable vectors.
+-}
+{-# LANGUAGE RankNTypes #-}
+module Control.Foldl.Util.Vector where
+
+import Data.Vector.Generic
+import Control.Monad.ST
+import qualified Data.Vector.Generic.Mutable as M
+import qualified Control.Foldl.Util.MVector as M
+
+
+{-|
+>>> fromReverseListN 3 [1,2,3] :: Data.Vector.Vector Int
+[3,2,1]
+-}
+{-# INLINE fromReverseListN #-}
+fromReverseListN :: Vector v a => Int -> [a] -> v a
+fromReverseListN size list =
+  initialized size $ \ mv -> M.writeListInReverseOrderStartingFrom mv (pred size) list
+
+{-# INLINE initialized #-}
+initialized :: Vector v a => Int -> (forall s. Mutable v s a -> ST s ()) -> v a
+initialized size initialize = runST $ do
+  mv <- M.unsafeNew size
+  initialize mv
+  unsafeFreeze mv
