diff options
author | Denton Cockburn <kanielc@gmail.com> | 2014-12-13 21:46:25 -0500 |
---|---|---|
committer | Denton Cockburn <kanielc@gmail.com> | 2014-12-14 10:57:04 -0500 |
commit | 6e8c60eabbbf0f21ef8e0b87267952bec2f85159 (patch) | |
tree | 8c543503f0d4a815f24cd5dcc31fa7229db3e443 /test/junit | |
parent | d9f623db0ff1d20040939fbb9e15d4d4e5887c75 (diff) | |
download | scala-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/junit')
-rw-r--r-- | test/junit/scala/collection/mutable/ArrayBufferTest.scala | 36 |
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) } + } +} |