Skip to content

Instantly share code, notes, and snippets.

@travisbrown
Created April 7, 2016 01:38
Show Gist options
  • Save travisbrown/b5e6b2eee48322370b5c146aa61fd2c5 to your computer and use it in GitHub Desktop.
Save travisbrown/b5e6b2eee48322370b5c146aa61fd2c5 to your computer and use it in GitHub Desktop.
import cats.data.Xor
import io.circe.{ Decoder, Encoder, Error }
import io.circe.generic.semiauto._
import io.circe.jawn._
import io.circe.syntax._
import java.util.concurrent.TimeUnit
import org.openjdk.jmh.annotations._
import scodec.{ Attempt, Codec, DecodeResult }
import scodec.codecs._
case class User(id: Long, name: String)
object User {
implicit val decodeUser: Decoder[User] = deriveDecoder
implicit val encodeUser: Encoder[User] = deriveEncoder
implicit val userCodec: Codec[User] =
(int64 :: variableSizeBits(uint24, utf8)).as[User]
}
case class Greeting(user: User, message: String)
object Greeting {
implicit val decodeGreeting: Decoder[Greeting] = deriveDecoder
implicit val encodeGreeting: Encoder[Greeting] = deriveEncoder
implicit val greetingCodec: Codec[Greeting] =
(User.userCodec :: variableSizeBits(uint24, utf8)).as[Greeting]
}
@State(Scope.Thread)
@BenchmarkMode(Array(Mode.Throughput))
@OutputTimeUnit(TimeUnit.SECONDS)
class ScodecBenchmark {
val greeting: Greeting =
Greeting(User(10001L, "Foo McBar"), "Hello, Foo McBar")
@Benchmark
def roundtripCirce: Xor[Error, Greeting] =
decode[Greeting](greeting.asJson.noSpaces)
@Benchmark
def roundtripScodec: Attempt[DecodeResult[Greeting]] =
Codec.encode(greeting).flatMap(Codec.decode[Greeting])
}
@travisbrown
Copy link
Author

Results:

[info] Benchmark                         Mode  Cnt       Score       Error  Units
[info] ScodecBenchmark.roundtripCirce   thrpt   40  436423.069 ±  6196.519  ops/s
[info] ScodecBenchmark.roundtripScodec  thrpt   40  830264.683 ± 16183.400  ops/s

And 69 vs. 39 bytes for greeting.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment