@@ -255,10 +255,6 @@ impl<A, D> Array<A, D>
255
255
debug_assert ! ( data_ptr <= array_memory_head_ptr) ;
256
256
debug_assert ! ( array_memory_head_ptr <= data_end_ptr) ;
257
257
258
- // iter is a raw pointer iterator traversing self_ in its standard order
259
- let mut iter = Baseiter :: new ( self_. ptr . as_ptr ( ) , self_. dim , self_. strides ) ;
260
- let mut dropped_elements = 0 ;
261
-
262
258
// The idea is simply this: the iterator will yield the elements of self_ in
263
259
// increasing address order.
264
260
//
@@ -267,6 +263,25 @@ impl<A, D> Array<A, D>
267
263
//
268
264
// We have to drop elements in the range from `data_ptr` until (not including)
269
265
// `data_end_ptr`, except those that are produced by `iter`.
266
+
267
+ // As an optimization, the innermost axis is removed if it has stride 1, because
268
+ // we then have a long stretch of contiguous elements we can skip as one.
269
+ let inner_lane_len;
270
+ if self_. ndim ( ) > 1 && self_. strides . last_elem ( ) == 1 {
271
+ self_. dim . slice_mut ( ) . rotate_right ( 1 ) ;
272
+ self_. strides . slice_mut ( ) . rotate_right ( 1 ) ;
273
+ inner_lane_len = self_. dim [ 0 ] ;
274
+ self_. dim [ 0 ] = 1 ;
275
+ self_. strides [ 0 ] = 1 ;
276
+ } else {
277
+ inner_lane_len = 1 ;
278
+ }
279
+
280
+ // iter is a raw pointer iterator traversing the array in memory order now with the
281
+ // sorted axes.
282
+ let mut iter = Baseiter :: new ( self_. ptr . as_ptr ( ) , self_. dim , self_. strides ) ;
283
+ let mut dropped_elements = 0 ;
284
+
270
285
let mut last_ptr = data_ptr;
271
286
272
287
while let Some ( elem_ptr) = iter. next ( ) {
@@ -278,8 +293,8 @@ impl<A, D> Array<A, D>
278
293
last_ptr = last_ptr. add ( 1 ) ;
279
294
dropped_elements += 1 ;
280
295
}
281
- // Next interval will continue one past the current element
282
- last_ptr = elem_ptr. add ( 1 ) ;
296
+ // Next interval will continue one past the current lane
297
+ last_ptr = elem_ptr. add ( inner_lane_len ) ;
283
298
}
284
299
285
300
while last_ptr < data_end_ptr {
0 commit comments