Skip to content

Commit fec9516

Browse files
committed
Add benchmarks for base64 JDK vs apache commons
1 parent 86175f1 commit fec9516

File tree

7 files changed

+338
-0
lines changed

7 files changed

+338
-0
lines changed

WORKSPACE

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,15 @@ maven_install(
148148
repositories = maven_repositories,
149149
)
150150

151+
maven_install(
152+
name = "jwt",
153+
artifacts = [
154+
"commons-codec:commons-codec:1.15",
155+
],
156+
fetch_sources = True,
157+
repositories = maven_repositories,
158+
)
159+
151160
maven_install(
152161
name = "scala_serialization_maven",
153162
artifacts = [

src/com/komanov/jwt/base64/BUILD

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
java_library(
2+
name = "base64",
3+
srcs = ["Base64Helper.java"],
4+
visibility = [
5+
"//src/com/komanov/jwt/base64:__subpackages__",
6+
],
7+
deps = [
8+
"@jwt//:commons_codec_commons_codec",
9+
],
10+
)
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package com.komanov.jwt.base64;
2+
3+
import static org.apache.commons.codec.binary.BaseNCodec.MIME_CHUNK_SIZE;
4+
5+
public abstract class Base64Helper {
6+
private Base64Helper() {
7+
}
8+
9+
public static final class Jdk {
10+
private Jdk() {
11+
}
12+
13+
private static final java.util.Base64.Decoder regularDecoder = java.util.Base64.getDecoder();
14+
private static final java.util.Base64.Decoder urlSafeDecoder = java.util.Base64.getUrlDecoder();
15+
16+
private static final java.util.Base64.Encoder regularEncoder = java.util.Base64.getEncoder();
17+
private static final java.util.Base64.Encoder urlSafeEncoder = java.util.Base64.getUrlEncoder().withoutPadding();
18+
19+
public static byte[] encode(byte[] data) {
20+
return regularEncoder.encode(data);
21+
}
22+
23+
public static byte[] encodeUrlSafe(byte[] data) {
24+
return urlSafeEncoder.encode(data);
25+
}
26+
27+
public static byte[] decode(byte[] data) {
28+
return regularDecoder.decode(data);
29+
}
30+
31+
public static byte[] decodeUrlSafe(byte[] data) {
32+
return urlSafeDecoder.decode(data);
33+
}
34+
}
35+
36+
public static class Commons {
37+
private Commons() {
38+
}
39+
40+
private static final org.apache.commons.codec.binary.Base64 regular = new org.apache.commons.codec.binary.Base64(MIME_CHUNK_SIZE, null, false);
41+
private static final org.apache.commons.codec.binary.Base64 urlSafe = new org.apache.commons.codec.binary.Base64(MIME_CHUNK_SIZE, null, true);
42+
43+
public static byte[] encode(byte[] data) {
44+
return regular.encode(data);
45+
}
46+
47+
public static byte[] encodeUrlSafe(byte[] data) {
48+
return urlSafe.encode(data);
49+
}
50+
51+
public static byte[] decode(byte[] data) {
52+
return regular.decode(data);
53+
}
54+
55+
public static byte[] decodeUrlSafe(byte[] data) {
56+
return urlSafe.decode(data);
57+
}
58+
}
59+
}

src/com/komanov/jwt/base64/jmh/BUILD

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
scala_benchmark_jmh(
2+
name = "jmh",
3+
srcs = glob(["*.scala"]),
4+
deps = [
5+
"//src/com/komanov/jwt/base64",
6+
],
7+
)

src/com/komanov/jwt/base64/jmh/Base64Benchmarks.scala

Lines changed: 190 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
scala_specs2_junit(
2+
name = "tests",
3+
srcs = glob(["*.scala"]),
4+
deps = [
5+
"//src/com/komanov/jwt/base64",
6+
],
7+
)
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.komanov.jwt.base64.tests
2+
3+
import com.komanov.jwt.base64.Base64Helper.Jdk
4+
import com.komanov.jwt.base64.Base64Helper.Commons
5+
import org.specs2.mutable.SpecificationWithJUnit
6+
import org.specs2.specification.core.Fragments
7+
8+
import java.nio.charset.StandardCharsets
9+
import scala.util.Random
10+
11+
class Base64HelperTest extends SpecificationWithJUnit {
12+
Fragments.foreach(Seq(
13+
"" -> "",
14+
"a" -> "YQ==",
15+
"abcd" -> "YWJjZA==",
16+
"nmmфывыаывпврапопррло" -> "bm1t0YTRi9Cy0YvQsNGL0LLQv9Cy0YDQsNC/0L7Qv9GA0YDQu9C+",
17+
)) { case (data, expected) =>
18+
s"(jdk) regular encode-decode for input: $data" >> {
19+
val encoded = Jdk.encode(data.getBytes(StandardCharsets.UTF_8))
20+
str(encoded) mustEqual expected
21+
val bytes = Jdk.decode(encoded)
22+
str(bytes) mustEqual data
23+
}
24+
25+
s"(commons) regular encode-decode for input: $data" >> {
26+
val encoded = Commons.encode(data.getBytes(StandardCharsets.UTF_8))
27+
str(encoded) mustEqual expected
28+
val bytes = Commons.decode(encoded)
29+
str(bytes) mustEqual data
30+
}
31+
}
32+
33+
Fragments.foreach(Seq(
34+
"" -> "",
35+
"a" -> "YQ",
36+
"abcd" -> "YWJjZA",
37+
"nmmфывыаывпврапопррло" -> "bm1t0YTRi9Cy0YvQsNGL0LLQv9Cy0YDQsNC_0L7Qv9GA0YDQu9C-",
38+
)) { case (data, expected) =>
39+
s"(jdk) regular encode-decode for input: $data" >> {
40+
val encoded = Jdk.encodeUrlSafe(data.getBytes(StandardCharsets.UTF_8))
41+
str(encoded) mustEqual expected
42+
val bytes = Jdk.decodeUrlSafe(encoded)
43+
str(bytes) mustEqual data
44+
}
45+
46+
s"(commons) regular encode-decode for input: $data" >> {
47+
val encoded = Commons.encodeUrlSafe(data.getBytes(StandardCharsets.UTF_8))
48+
str(encoded) mustEqual expected
49+
val bytes = Commons.decodeUrlSafe(encoded)
50+
str(bytes) mustEqual data
51+
}
52+
}
53+
54+
private def str(bytes: Array[Byte]): String =
55+
new String(bytes, StandardCharsets.UTF_8)
56+
}

0 commit comments

Comments
 (0)