@@ -103,17 +103,37 @@ class ArrayDeque[A] private(var array: Array[AnyRef], var start: Int, var end: I
103103 copySliceToArray(srcStart = idx + removals - 1 , dest = array2, destStart = idx, maxItems = size)
104104 set(array = array2, start = 0 , end = size - removals)
105105 } else if (size - idx <= idx + removals) {
106- // TODO: Instead of if in the loop, break into 2 loops
107- (idx until size) foreach {i =>
108- val elem = if (i + removals < size) get(i + removals) else null
109- set(i, elem)
106+ /* We are doing this but without a if and foreach but 2 while loops for perf reasons:
107+ (idx until size) foreach {i =>
108+ val elem = if (i + removals < size) get(i + removals) else null
109+ set(i, elem)
110+ }
111+ */
112+ var i = idx
113+ while (i + removals < size) {
114+ set(i, get(i + removals))
115+ i += 1
116+ }
117+ while (i < size) {
118+ set(i, null )
119+ i += 1
110120 }
111121 end = (end - removals) & mask
112122 } else {
113- // TODO: Instead of if in the loop, break into 2 loops
114- (0 until (idx + removals)).reverse foreach {i =>
115- val elem = if (i - removals < 0 ) null else get(i - removals)
116- set(i, elem)
123+ /* We are doing this but without a if and foreach but 2 while loops for perf reasons:
124+ (0 until (idx + removals)).reverse foreach {i =>
125+ val elem = if (i - removals < 0) null else get(i - removals)
126+ set(i, elem)
127+ }
128+ */
129+ var i = idx + removals - 1
130+ while (i - removals >= 0 ) {
131+ set(i, get(i - removals))
132+ i -= 1
133+ }
134+ while (i >= 0 ) {
135+ set(i, null )
136+ i -= 1
117137 }
118138 start = (start + removals) & mask
119139 }
0 commit comments