quantile: remove allocs.
diff --git a/quantile/bench_test.go b/quantile/bench_test.go
index e3667b4..cfb8b32 100644
--- a/quantile/bench_test.go
+++ b/quantile/bench_test.go
@@ -5,6 +5,8 @@
 )
 
 func BenchmarkInsertTargeted(b *testing.B) {
+	b.ReportAllocs()
+
 	s := NewTargeted(0.01, 0.5, 0.9, 0.99)
 	b.ResetTimer()
 	for i := float64(0); i < float64(b.N); i++ {
diff --git a/quantile/stream.go b/quantile/stream.go
index 74372ac..566d0fb 100644
--- a/quantile/stream.go
+++ b/quantile/stream.go
@@ -169,7 +169,7 @@
 type stream struct {
 	epsilon float64
 	n       float64
-	l       []*Sample
+	l       []Sample
 	ƒ       invariant
 }
 
@@ -198,15 +198,15 @@
 			c := s.l[i]
 			if c.Value > sample.Value {
 				// Insert at position i.
-				s.l = append(s.l, nil)
+				s.l = append(s.l, Sample{})
 				copy(s.l[i+1:], s.l[i:])
-				s.l[i] = &Sample{sample.Value, sample.Width, math.Floor(s.ƒ(s, r)) - 1}
+				s.l[i] = Sample{sample.Value, sample.Width, math.Floor(s.ƒ(s, r)) - 1}
 				i++
 				goto inserted
 			}
 			r += c.Width
 		}
-		s.l = append(s.l, &Sample{sample.Value, sample.Width, 0})
+		s.l = append(s.l, Sample{sample.Value, sample.Width, 0})
 		i++
 	inserted:
 		s.n += sample.Width
@@ -237,18 +237,21 @@
 		return
 	}
 	x := s.l[len(s.l)-1]
+	xi := len(s.l) - 1
 	r := s.n - 1 - x.Width
 
 	for i := len(s.l) - 2; i >= 0; i-- {
 		c := s.l[i]
 		if c.Width+x.Width+x.Delta <= s.ƒ(s, r) {
 			x.Width += c.Width
+			s.l[xi] = x
 			// Remove element at i.
 			copy(s.l[i:], s.l[i+1:])
-			s.l[len(s.l)-1] = nil
 			s.l = s.l[:len(s.l)-1]
+			xi -= 1
 		} else {
 			x = c
+			xi = i
 		}
 		r -= c.Width
 	}
@@ -256,8 +259,6 @@
 
 func (s *stream) samples() Samples {
 	samples := make(Samples, len(s.l))
-	for i, c := range s.l {
-		samples[i] = *c
-	}
+	copy(samples, s.l)
 	return samples
 }