diff --git a/benchmark/make.sh b/benchmark/make.sh
index 8c2a7e23389d7d9240079cbffec6e52c45d73648..003868a7f5cf8eb088c494e0e65a4886861b7cdf 100755
--- a/benchmark/make.sh
+++ b/benchmark/make.sh
@@ -660,20 +660,34 @@ plot_reach () {
 
 # The get benchmark.
 
-run_rbget () {
+run_rbget1 () {
   benchmark=rbget
   make src/$benchmark
   run_prologue
   prun -prog $prog \
     -n 10$K,20$K,40$K,80$K,160$K,320$K,640$K,2$M,8$M \
     -k 100$K \
-    -seq NumeriChunk,StackVectorNoFunctor \
+    -seq Array,StackVectorNoFunctor,ESek_get,PSek_get,PSek_reach,FmlibRbtrees,NumeriChunk,PdarrayNarytree5,PdarrayNarytree8 \
     -runs 3 \
     -distance -1 \
     -output $result
   run_postlogue
 }
-# ESek_get,Array
+
+run_rbget () {
+  benchmark=rbget
+  make src/$benchmark
+  run_prologue
+  prun -prog $prog \
+    -n 10$K,20$K,40$K,80$K,160$K,320$K,640$K,2$M,8$M \
+    -k 100$K \
+    -seq FmlibRbtrees,NumeriChunk,PdarrayNarytree8 \
+    -runs 1 \
+    -distance -1 \
+    -output $result
+  run_postlogue
+}
+# ,Array
 
 # ,FmlibRbtrees,PSek_get
 #    -runs 3 \
diff --git a/benchmark/src/darray.ml b/benchmark/src/darray.ml
index c412249e5ef437238f647003b32299b0d0593972..caa4618a98840352ddfd3dfcf24a031f02112e49 100644
--- a/benchmark/src/darray.ml
+++ b/benchmark/src/darray.ml
@@ -231,7 +231,7 @@ let to_array_with_transfer (t : 'a t) : 'a array =
     else get_fresh_array t
 
 
-(*------------------------------------------*)
+(*------------------------------------------
 
 let measure_time (f : unit -> 'a) : 'a * int =
   let t0 = Unix.gettimeofday () in
@@ -261,7 +261,7 @@ let _testperf =
       r := set !r (i mod nb) i;
     done;
   )
-
+*)
 
 (*------------------------------------------*)
 (*
diff --git a/benchmark/src/pdarray_narytree.ml b/benchmark/src/pdarray_narytree.ml
index 64cd7f64c6e3d54ae1c605df2ec228816aee486f..6bfdab830ac6d5b9f2c44077dbb1a19f8a9a82ba 100644
--- a/benchmark/src/pdarray_narytree.ml
+++ b/benchmark/src/pdarray_narytree.ml
@@ -38,6 +38,90 @@ let length (s : 'a t) : int =
 let get (s : 'a t) (i : int) : 'a =
   (* assert (0 <= i && i < length s) *)
   let b, d = params s in
+  (* optimizations *)
+  if d = 0 then begin
+     Darray.get s (2 + i)
+  end else if d = 1 then begin
+
+    let i1 = i in
+    let s1 = s in
+
+    let w1 = b in
+    let id1 = i1 lsr w1 in
+    let i0 = i1 - id1 * (1 lsl w1) in
+    let s0 = Darray.get (cast s1) (2 + id1) in
+
+    Darray.get s0 i0
+
+  end else if d = 2 then begin
+
+    let i2 = i in
+    let s2 = s in
+
+    let w2 = 2*b in
+    let id2 = i2 lsr w2 in
+    let i1 = i2 - id2 * (1 lsl w2) in
+    let s1 = Darray.get (cast s2) (2 + id2) in
+
+    let w1 = b in
+    let id1 = i1 lsr w1 in
+    let i0 = i1 - id1 * (1 lsl w1) in
+    let s0 = Darray.get (cast s1) id1 in
+
+    Darray.get s0 i0
+
+  end else if d = 3 then begin
+
+    let i3 = i in
+    let s3 = s in
+
+    let w3 = 3*b in
+    let id3 = i3 lsr w3 in
+    let i2 = i3 - id3 * (1 lsl w3) in
+    let s2 = Darray.get (cast s3) (2 + id3) in
+
+    let w2 = 2*b in
+    let id2 = i2 lsr w2 in
+    let i1 = i2 - id2 * (1 lsl w2) in
+    let s1 = Darray.get (cast s2) id2 in
+
+    let w1 = b in
+    let id1 = i1 lsr w1 in
+    let i0 = i1 - id1 * (1 lsl w1) in
+    let s0 = Darray.get (cast s1) id1 in
+
+    Darray.get s0 i0
+
+  end else if d = 4 then begin
+
+    let i4 = i in
+    let s4 = s in
+
+    let w4 = 4*b in
+    let id4 = i4 lsr w4 in
+    let i3 = i4 - id4 * (1 lsl w4) in
+    let s3 = Darray.get (cast s4) (2 + id4) in
+
+    let w3 = 3*b in
+    let id3 = i3 lsr w3 in
+    let i2 = i3 - id3 * (1 lsl w3) in
+    let s2 = Darray.get (cast s3) id3 in
+
+    let w2 = 2*b in
+    let id2 = i2 lsr w2 in
+    let i1 = i2 - id2 * (1 lsl w2) in
+    let s1 = Darray.get (cast s2) id2 in
+
+    let w1 = b in
+    let id1 = i1 lsr w1 in
+    let i0 = i1 - id1 * (1 lsl w1) in
+    let s0 = Darray.get (cast s1) id1 in
+
+    Darray.get s0 i0
+
+
+  end else
+  (* general case *)
   let rec aux : 'a. ?offset:int -> int -> 'a t -> int -> 'a =
    fun (type a) ?(offset:int=0) (d:int) (s:a t) (i:int) : a ->
     (* Printf.printf "aux offset=%d depth=%d i=%d\n" offset d i; *)
@@ -51,6 +135,7 @@ let get (s : 'a t) (i : int) : 'a =
     end in
   aux ~offset:2 d s i
 
+
 (** [set s i v] updates the element at index [i] with [v].
     Requires [0 <= i < length t]. *)
 let set (s : 'a t) (i : int) (v : 'a) : 'a t =
diff --git a/benchmark/src/reach/Main.ml b/benchmark/src/reach/Main.ml
index a723a4418a908b32dad4f71ea003c25986887990..88a99758208bd9498a55afb7d779e7bb45043a44 100644
--- a/benchmark/src/reach/Main.ml
+++ b/benchmark/src/reach/Main.ml
@@ -140,7 +140,7 @@ let benchmark =
           sum := !sum + x
         done;
         sink !sum
-   end else if seq = "ParrayNarytree" then begin
+   end else if seq = "ParrayNarytree5" then begin
       let s = Parray_narytree.init n (fun i -> i) in
       fun () ->
         (* This is the timed section. *)
@@ -152,8 +152,20 @@ let benchmark =
           sum := !sum + x
         done;
         sink !sum
-   end else if seq = "PdarrayNarytree" then begin
-      let s = Pdarray_narytree.init n (fun i -> i) in
+   end else if seq = "PdarrayNarytree5" then begin
+      let s = Pdarray_narytree.init ~base:5 n (fun i -> i) in
+      fun () ->
+        (* This is the timed section. *)
+        (* Calls to [get i] for each target index. *)
+        let sum = ref 0 in
+        for index = 0 to k - 1 do
+          let j = a.(index) in
+          let x = Pdarray_narytree.get s j in
+          sum := !sum + x
+        done;
+        sink !sum
+   end else if seq = "PdarrayNarytree8" then begin
+      let s = Pdarray_narytree.init ~base:8 n (fun i -> i) in
       fun () ->
         (* This is the timed section. *)
         (* Calls to [get i] for each target index. *)