summaryrefslogtreecommitdiff
path: root/src/test/scala/spray/json/JsonParserSpec.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/scala/spray/json/JsonParserSpec.scala')
-rw-r--r--src/test/scala/spray/json/JsonParserSpec.scala30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/test/scala/spray/json/JsonParserSpec.scala b/src/test/scala/spray/json/JsonParserSpec.scala
index e5645a4..36c9726 100644
--- a/src/test/scala/spray/json/JsonParserSpec.scala
+++ b/src/test/scala/spray/json/JsonParserSpec.scala
@@ -84,6 +84,36 @@ class JsonParserSpec extends Specification {
)
list.map(_.asInstanceOf[JsObject].fields("questions").asInstanceOf[JsArray].elements.size) === List.fill(20)(100)
}
+ "not show bad performance characteristics when object keys' hashCodes collide" in {
+ val numKeys = 10000
+ val value = "null"
+
+ val regularKeys = Iterator.from(1).map(i => s"key_$i").take(numKeys)
+ val collidingKeys = HashCodeCollider.zeroHashCodeIterator().take(numKeys)
+
+ def createJson(keys: Iterator[String]): String = keys.mkString("""{"""", s"""":$value,"""", s"""":$value}""")
+
+ def nanoBench(block: => Unit): Long = {
+ // great microbenchmark (the comment must be kept, otherwise it's not true)
+ val f = block _
+
+ // warmup
+ (1 to 10).foreach(_ => f())
+
+ val start = System.nanoTime()
+ f()
+ val end = System.nanoTime()
+ end - start
+ }
+
+ val regularJson = createJson(regularKeys)
+ val collidingJson = createJson(collidingKeys)
+
+ val regularTime = nanoBench { JsonParser(regularJson) }
+ val collidingTime = nanoBench { JsonParser(collidingJson) }
+
+ collidingTime / regularTime must be < 2L // speed must be in same order of magnitude
+ }
"produce proper error messages" in {
def errorMessage(input: String) =