diff --git a/foldl-benchmark/Main.hs b/foldl-benchmark/Main.hs
new file mode 100644
--- /dev/null
+++ b/foldl-benchmark/Main.hs
@@ -0,0 +1,25 @@
+module Main where
+
+import Prelude
+import Bug
+import Criterion
+import Criterion.Main
+import qualified Control.Foldl as A
+import qualified Data.Vector as F
+import qualified VectorBuilder.Builder as N
+import qualified VectorBuilder.Vector as O
+
+
+main =
+  defaultMain
+  [
+    bench "vector-builder" (nf foldWithBuilder input),
+    bench "default" (nf foldDefault input)
+  ]
+  where
+    input =
+      [0..1000]
+    foldWithBuilder input =
+      A.fold (A.foldMap N.singleton O.build) input :: Vector Int
+    foldDefault input =
+      runST (A.foldM A.vector input) :: Vector Int
diff --git a/foldl-profiling/Main.hs b/foldl-profiling/Main.hs
new file mode 100644
--- /dev/null
+++ b/foldl-profiling/Main.hs
@@ -0,0 +1,15 @@
+module Main where
+
+import Prelude
+import qualified Data.Vector.Unboxed as V
+import qualified Control.Foldl as L
+import qualified VectorBuilder.Builder as N
+import qualified VectorBuilder.Vector as O
+
+main :: IO ()
+main = (print . V.maximum) (L.fold fold input) where
+  input = [1..1000000] :: [Int]
+  fold = L.Fold step begin done where
+    begin = N.empty
+    step x a = x <> N.singleton a
+    done = O.build
diff --git a/library/VectorBuilder/Private/Action.hs b/library/VectorBuilder/Private/Action.hs
--- a/library/VectorBuilder/Private/Action.hs
+++ b/library/VectorBuilder/Private/Action.hs
@@ -11,15 +11,19 @@
   deriving (Functor)
 
 instance Applicative (Action element) where
+  {-# INLINABLE pure #-}
   pure result =
     Action (const (pure result))
+  {-# INLINABLE (<*>) #-}
   (<*>) (Action actionFn1) (Action actionFn2) =
     Action ((<*>) <$> actionFn1 <*> actionFn2)
 
+{-# INLINABLE unsafeWrite #-}
 unsafeWrite :: Int -> element -> Action element ()
 unsafeWrite index element =
   Action (\mVector -> A.unsafeWrite mVector index element)
 
+{-# INLINABLE unsafeWriteMany #-}
 unsafeWriteMany :: B.Vector vector element => Int -> vector element -> Action element ()
 unsafeWriteMany startingIndex appendedVector =
   Action (\mVector -> B.ifoldM' (\_ index element -> A.unsafeWrite mVector (startingIndex + index) element) () appendedVector)
diff --git a/library/VectorBuilder/Private/Builder.hs b/library/VectorBuilder/Private/Builder.hs
--- a/library/VectorBuilder/Private/Builder.hs
+++ b/library/VectorBuilder/Private/Builder.hs
@@ -16,14 +16,17 @@
 -- |
 -- Provides support for /O(1)/ concatenation.
 instance Monoid (Builder element) where
+  {-# INLINE mempty #-}
   mempty =
     VectorBuilder.Private.Builder.empty
+  {-# INLINE mappend #-}
   mappend =
     prepend
 
 -- |
 -- Provides support for /O(1)/ concatenation.
 instance Semigroup (Builder element) where
+  {-# INLINE (<>) #-}
   (<>) =
     prepend
 
@@ -32,12 +35,14 @@
 
 -- |
 -- Empty builder.
+{-# INLINE empty #-}
 empty :: Builder element
 empty =
   Builder (pure ())
 
 -- |
 -- Builder of a single element.
+{-# INLINE singleton #-}
 singleton :: element -> Builder element
 singleton element =
   Builder (A.snoc element)
@@ -46,6 +51,7 @@
 -- Builder from an immutable vector of elements.
 -- 
 -- Supports all kinds of vectors: boxed, unboxed, primitive, storable.
+{-# INLINE vector #-}
 vector :: B.Vector vector element => vector element -> Builder element
 vector vector =
   Builder (A.append vector)
@@ -53,18 +59,22 @@
 
 -- * Updates
 
+{-# INLINE snoc #-}
 snoc :: element -> Builder element -> Builder element
 snoc element (Builder action) =
   Builder (action *> A.snoc element)
 
+{-# INLINE cons #-}
 cons :: element -> Builder element -> Builder element
 cons element (Builder action) =
   Builder (A.snoc element *> action)
 
+{-# INLINE prepend #-}
 prepend :: Builder element -> Builder element -> Builder element
 prepend (Builder action1) (Builder action2) =
   Builder (action1 *> action2)
 
+{-# INLINE append #-}
 append :: Builder element -> Builder element -> Builder element
 append (Builder action1) (Builder action2) =
   Builder (action1 <* action2)
diff --git a/library/VectorBuilder/Private/SizeTrackingAction.hs b/library/VectorBuilder/Private/SizeTrackingAction.hs
--- a/library/VectorBuilder/Private/SizeTrackingAction.hs
+++ b/library/VectorBuilder/Private/SizeTrackingAction.hs
@@ -11,22 +11,26 @@
   deriving (Functor)
 
 instance Applicative (SizeTrackingAction element) where
+  {-# INLINE pure #-}
   pure result =
     SizeTrackingAction (\size -> (pure result, size))
+  {-# INLINE (<*>) #-}
   (<*>) (SizeTrackingAction sizeTrackingActionFn1) (SizeTrackingAction sizeTrackingActionFn2) =
     SizeTrackingAction sizeTrackingActionFn
     where
       sizeTrackingActionFn size =
         case sizeTrackingActionFn1 size of
-          (action1, size1) ->
+          (action1, !size1) ->
             case sizeTrackingActionFn2 size1 of
-              (action2, size2) ->
+              (action2, !size2) ->
                 (action1 <*> action2, size2)
 
+{-# INLINE snoc #-}
 snoc :: element -> SizeTrackingAction element ()
 snoc element =
   SizeTrackingAction (\size -> (C.unsafeWrite size element, succ size))
 
+{-# INLINE append #-}
 append :: B.Vector vector element => vector element -> SizeTrackingAction element ()
 append appendedVector =
   SizeTrackingAction (\size -> (C.unsafeWriteMany size appendedVector, size + B.length appendedVector))
diff --git a/vector-builder.cabal b/vector-builder.cabal
--- a/vector-builder.cabal
+++ b/vector-builder.cabal
@@ -1,7 +1,7 @@
 name:
   vector-builder
 version:
-  0.3.1
+  0.3.2
 synopsis:
   Vector builder
 description:
@@ -106,3 +106,55 @@
     vector-builder,
     -- 
     rebase
+
+
+benchmark foldl-benchmark
+  type: 
+    exitcode-stdio-1.0
+  hs-source-dirs:
+    foldl-benchmark
+  main-is:
+    Main.hs
+  ghc-options:
+    -O2
+    -threaded
+    "-with-rtsopts=-N"
+    -rtsopts
+  default-extensions:
+    Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples
+  default-language:
+    Haskell2010
+  build-depends:
+    vector-builder,
+    foldl == 1.2.*,
+    -- benchmarking:
+    criterion >= 1.1 && < 2,
+    -- general:
+    bug == 1.*,
+    rerebase < 2
+
+
+test-suite foldl-profiling
+  type: 
+    exitcode-stdio-1.0
+  hs-source-dirs:
+    foldl-profiling
+  main-is:
+    Main.hs
+  ghc-options:
+    -O2
+    -threaded
+    "-with-rtsopts=-N"
+    -rtsopts
+  default-extensions:
+    Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples
+  default-language:
+    Haskell2010
+  build-depends:
+    vector-builder,
+    foldl == 1.2.*,
+    -- benchmarking:
+    criterion >= 1.1 && < 2,
+    -- general:
+    bug == 1.*,
+    rerebase < 2
