Это нормальное поведение JIT JVM - абсолютно нормально иметь медленный начальный запуск с последующими оптимизированными / быстрыми последующими запусками из-за оптимизации JIT. Выполните только вызов compact()
в цикле и посмотрите, что произойдет.
Вот ваш тест, переписанный в качестве доказательства с использованием самого «дорогого» алгоритма секретного ключа, HMAC-SHA-512:
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.lang.Collections;
import io.jsonwebtoken.lang.Strings;
import io.jsonwebtoken.security.Keys;
import java.security.Key;
import java.util.Date;
import java.util.List;
import java.util.UUID;
public class Test {
private static final Key signingKey = Keys.secretKeyFor(SignatureAlgorithm.HS512);
private static <T> String createJWT(String id, String issuer, String subject, List<T> authories, String loginUserData,
long ttlMillis) {
//The JWT signature algorithm we will be using to sign the token
long startTime = System.currentTimeMillis();
System.out.println("createJWT id=" + id + ";issuer=" + ";subject=" + subject);
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS512;
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
//Let's set the JWT Claims
JwtBuilder builder = Jwts.builder().setId(id).setIssuedAt(now).setSubject(subject)
.setIssuer(issuer);
if (!Collections.isEmpty(authories)) {
builder.claim("authorities", authories);
}
if (!Strings.hasText(loginUserData)) {
builder.claim("loginUserData", loginUserData);
}
builder.signWith(signingKey);
//if it has been specified, let's add the expiration
if (ttlMillis >= 0) {
long expMillis = nowMillis + ttlMillis;
Date exp = new Date(expMillis);
builder.setExpiration(exp);
}
System.out.println("createJWT process id=" + id + ";issuer=" + ";subject=" + subject + ";time(ms)="
+ (System.currentTimeMillis() - startTime));
//Builds the JWT and serializes it to a compact, URL-safe string
String token = builder.compact();
System.out.println("createJWT end id=" + id + ";issuer=" + ";subject=" + subject + ";time(ms)="
+ (System.currentTimeMillis() - startTime));
return token;
}
public static void main(String[] args) {
for( int i = 0; i < 10; i++) {
createJWT(UUID.randomUUID().toString(), "issuer", "subject", null, "random user data", 1000);
}
}
}
Вот вывод из цикла:
createJWT id=983edbec-49f9-4754-9836-bae85c6c26e8;issuer=;subject=subject
createJWT process id=983edbec-49f9-4754-9836-bae85c6c26e8;issuer=;subject=subject;time(ms)=19
createJWT end id=983edbec-49f9-4754-9836-bae85c6c26e8;issuer=;subject=subject;time(ms)=319
createJWT id=ee8fa433-d032-4258-80e8-21f5fa54904c;issuer=;subject=subject
createJWT process id=ee8fa433-d032-4258-80e8-21f5fa54904c;issuer=;subject=subject;time(ms)=0
createJWT end id=ee8fa433-d032-4258-80e8-21f5fa54904c;issuer=;subject=subject;time(ms)=1
createJWT id=b8343d70-39e5-41fd-99e0-0046a0dcdb3c;issuer=;subject=subject
createJWT process id=b8343d70-39e5-41fd-99e0-0046a0dcdb3c;issuer=;subject=subject;time(ms)=0
createJWT end id=b8343d70-39e5-41fd-99e0-0046a0dcdb3c;issuer=;subject=subject;time(ms)=0
createJWT id=a2a81bfc-1bfd-42f8-81e3-dd27ca0bc343;issuer=;subject=subject
createJWT process id=a2a81bfc-1bfd-42f8-81e3-dd27ca0bc343;issuer=;subject=subject;time(ms)=0
createJWT end id=a2a81bfc-1bfd-42f8-81e3-dd27ca0bc343;issuer=;subject=subject;time(ms)=0
createJWT id=4236c531-d370-45d6-98cb-532b863d45af;issuer=;subject=subject
createJWT process id=4236c531-d370-45d6-98cb-532b863d45af;issuer=;subject=subject;time(ms)=0
createJWT end id=4236c531-d370-45d6-98cb-532b863d45af;issuer=;subject=subject;time(ms)=1
createJWT id=c3979b5c-2840-48bd-b72d-1e5d3776916b;issuer=;subject=subject
createJWT process id=c3979b5c-2840-48bd-b72d-1e5d3776916b;issuer=;subject=subject;time(ms)=0
createJWT end id=c3979b5c-2840-48bd-b72d-1e5d3776916b;issuer=;subject=subject;time(ms)=0
createJWT id=155e6ac6-da45-402b-a7a8-e98b358a3525;issuer=;subject=subject
createJWT process id=155e6ac6-da45-402b-a7a8-e98b358a3525;issuer=;subject=subject;time(ms)=0
createJWT end id=155e6ac6-da45-402b-a7a8-e98b358a3525;issuer=;subject=subject;time(ms)=1
createJWT id=f1cdc87c-2054-4ff5-bb5c-4b47384a1285;issuer=;subject=subject
createJWT process id=f1cdc87c-2054-4ff5-bb5c-4b47384a1285;issuer=;subject=subject;time(ms)=0
createJWT end id=f1cdc87c-2054-4ff5-bb5c-4b47384a1285;issuer=;subject=subject;time(ms)=0
createJWT id=0303f53f-9b9a-4e7c-99c6-788dbb883ce2;issuer=;subject=subject
createJWT process id=0303f53f-9b9a-4e7c-99c6-788dbb883ce2;issuer=;subject=subject;time(ms)=0
createJWT end id=0303f53f-9b9a-4e7c-99c6-788dbb883ce2;issuer=;subject=subject;time(ms)=1
createJWT id=701d08c1-cfcf-4f20-9270-5b1800d9a7e0;issuer=;subject=subject
createJWT process id=701d08c1-cfcf-4f20-9270-5b1800d9a7e0;issuer=;subject=subject;time(ms)=0
createJWT end id=701d08c1-cfcf-4f20-9270-5b1800d9a7e0;issuer=;subject=subject;time(ms)=0
Обратите внимание, что первый (и только первый) прогон стоит дорого (и, честно говоря, это всего 319 миллисекунд), а все остальные работают очень быстро благодаря оптимизации JIT.
Большинство последующих compact()
вызовов обычно составляют всего микросекунды (меньше, чем даже 1 миллисекунда)!