summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorDenton Cockburn <kanielc@gmail.com>2014-12-13 21:46:25 -0500
committerDenton Cockburn <kanielc@gmail.com>2014-12-14 10:57:04 -0500
commit6e8c60eabbbf0f21ef8e0b87267952bec2f85159 (patch)
tree8c543503f0d4a815f24cd5dcc31fa7229db3e443 /test
parentd9f623db0ff1d20040939fbb9e15d4d4e5887c75 (diff)
downloadscala-6e8c60eabbbf0f21ef8e0b87267952bec2f85159.tar.gz
scala-6e8c60eabbbf0f21ef8e0b87267952bec2f85159.tar.bz2
scala-6e8c60eabbbf0f21ef8e0b87267952bec2f85159.zip
SI-9043 ArrayBuffer.insert and insertAll are very slow
insert and insertAll were slower than their java equivalents by factors of 5 and 10 respectively. Benchmark code was provided here: https://gist.github.com/rklaehn/3e9290118fcf63d1feae We are using a toList to the source Traversable Then doing a length and a copy on that collection. By using an array, we can make use of faster methods. Managed to get the ratios down to 1.5 and 1.5 respectively. In addition to this, I think we should consider breaking insert into 2 separate methods, one for a single item and one for a collection. The varags version is very expensive when a single item is being inserted. @phaller @axel22
Diffstat (limited to 'test')
-rw-r--r--test/junit/scala/collection/mutable/ArrayBufferTest.scala36
1 files changed, 36 insertions, 0 deletions
diff --git a/test/junit/scala/collection/mutable/ArrayBufferTest.scala b/test/junit/scala/collection/mutable/ArrayBufferTest.scala
new file mode 100644
index 0000000000..8c83164027
--- /dev/null
+++ b/test/junit/scala/collection/mutable/ArrayBufferTest.scala
@@ -0,0 +1,36 @@
+package scala.collection.mutable
+
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.junit.{Assert, Test}
+
+import scala.tools.testing.AssertUtil
+
+/* Test for SI-9043 */
+@RunWith(classOf[JUnit4])
+class ArrayBufferTest {
+ @Test
+ def testInsertAll: Unit = {
+ val traver = ArrayBuffer(2, 4, 5, 7)
+ val testSeq = List(1, 3, 6, 9)
+
+ def insertAt(x: Int) = {
+ val clone = traver.clone()
+ clone.insertAll(x, testSeq)
+ clone
+ }
+
+ // Just insert some at position 0
+ Assert.assertEquals(ArrayBuffer(1, 3, 6, 9, 2, 4, 5, 7), insertAt(0))
+
+ // Insert in the middle
+ Assert.assertEquals(ArrayBuffer(2, 4, 1, 3, 6, 9, 5, 7), insertAt(2))
+
+ // No strange last position weirdness
+ Assert.assertEquals(ArrayBuffer(2, 4, 5, 7, 1, 3, 6, 9), insertAt(traver.size))
+
+ // Overflow is caught
+ AssertUtil.assertThrows[IndexOutOfBoundsException] { insertAt(-1) }
+ AssertUtil.assertThrows[IndexOutOfBoundsException] { insertAt(traver.size + 10) }
+ }
+}