CachingPerformance.java

82 lines | 2.139 kB Blame History Raw Download
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufrgs.inf.prosoft.cache;

import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author romulo
 */
public class CachingPerformance {

    private int misses;
    private int hits;
    private int invalidations;
    private int maximumSize;

    public CachingPerformance() {
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                Logger.getLogger(CachingPerformance.class.getName()).log(Level.INFO, "printing caching metrics");
                System.out.println(CachingPerformance.this);
            }
        });
    }

    public void reduce(CachingPerformance cachingPerformance) {
        this.misses += cachingPerformance.misses;
        this.hits += cachingPerformance.hits;
        this.invalidations += cachingPerformance.invalidations;
        this.maximumSize = Math.max(this.maximumSize, cachingPerformance.maximumSize);
    }

    public void registerHit() {
        this.hits++;
    }

    public void registerMiss() {
        this.misses++;
    }

    public void registerInvalidation() {
        this.invalidations++;
    }

    public void registerEntry() {
        this.maximumSize++;
    }

    public void registerSize(int size) {
        this.maximumSize = Math.max(this.maximumSize, size);
    }

    public long getRoundedHitRatio() {
        return Math.round(getHitRatio());
    }

    public double getHitRatio() {
        return this.hits * 100.0 / (this.hits + this.misses);
    }

    public String needInvalidation() {
        return this.invalidations > 0 ? "yes" : "no";
    }

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("H").append(this.hits);
        stringBuilder.append(" M").append(this.misses);
        stringBuilder.append(" I").append(this.invalidations);
        stringBuilder.append(" S").append(this.maximumSize);
        return stringBuilder.toString();
    }

}