/ / Guava RateLimiter en cours d'exécution trop souvent - java, goyave

Guava RateLimiter fonctionne trop souvent - java, goyave

J'ai un problème avec Guava RateLimiter. Je crée RateLimiter avec RateLimiter.create (1.0) ("1 autorisation par seconde") et appelle rateLimiter.acquire () à chaque cycle, mais lorsque j'effectue un test, le résultat suivant est obtenu:

Average: 1232.0 Diff since last: 2540
Average: 1180.0 Diff since last: 258
Average: 1159.0 Diff since last: 746
Average: 1151.0 Diff since last: 997
Average: 1144.0 Diff since last: 1004

La moyenne est le nombre de millisecondes qu'il dorten moyenne et diff est le nombre de millisecondes écoulées depuis la dernière impression. En moyenne, c’est correct, mon code ne peut pas être exécuté plus d’une fois par seconde. Mais parfois (comme vous pouvez le constater), il est exécuté plusieurs fois par seconde.

Avez-vous une idée pourquoi? Est-ce que je manque quelque chose?

Le code qui génère la sortie ci-dessus:

private  int numberOfRequests;
private Date start;
private long last;
private boolean first = true;
private void sleep() {
numberOfRequests++;
if(first) {
first = false;
start = new Date();
}

rateLimiter.acquire();

long current = new Date().getTime();
double num = (current -start.getTime()) / numberOfRequests;
System.out.println("Average: "+ num + " Diff since last: " + (current - last));
last = current;
}

Réponses:

0 pour la réponse № 1

Votre point de repère semble être défectueux - lorsque j'essaie de le répliquer, je vois très près d'une acquisition par seconde. Voici ma référence:

public class RateLimiterDemo {
public static void main(String[] args) {
StatsAccumulator stats = new StatsAccumulator();
RateLimiter rateLimiter = RateLimiter.create(1.0);
rateLimiter.acquire(); // discard initial permit
for (int i = 0; i < 10; i++) {
long start = System.nanoTime();
rateLimiter.acquire();
stats.add((System.nanoTime() - start) / 1_000_000.0);
}
System.out.println(stats.snapshot());
}
}

Un exemple de tirage imprime:

Stats{count=10, mean=998.9071456, populationStandardDeviation=3.25398397901304, min=989.303887, max=1000.971085}

La variance y est presque entièrement imputable aux frais généraux de l’indice de référence (peuplement du StatsAccumulator et calcul du delta temporel).

Même ce repère a des défauts (bien que je prétende que c’est moins grave). Créer un repère précis est très dur, et de simples repères assemblés sont souvent soit inexacts, soit pire, ils ne reflètent pas les performances réelles du code testé dans un contexte de production.