Changeset d062db3


Ignore:
Timestamp:
Dec 10, 2012 9:46:05 AM (7 years ago)
Author:
zab <zab@…>
Branches:
master
Children:
d2b2600
Parents:
32a8bb7
Message:

Object churn improvements, ticket #787

File:
1 edited

Legend:

Unmodified
Added
Removed
  • core/java/src/net/i2p/stat/RateStat.java

    r32a8bb7 rd062db3  
    33import java.io.IOException;
    44import java.io.OutputStream;
    5 import java.util.Arrays;
     5import static java.util.Arrays.*;
    66import java.util.Properties;
    7 import java.util.concurrent.ConcurrentHashMap;
    8 
    9 import net.i2p.I2PAppContext;
     7
    108import net.i2p.data.DataHelper;
    11 import net.i2p.util.Log;
    129
    1310/** coordinate a moving rate over various periods */
     
    2017    private final String _description;
    2118    /** actual rate objects for this statistic */
    22     protected final ConcurrentHashMap<Long, Rate> _rates;
     19    protected final Rate[] _rates;
    2320    /** component we tell about events as they occur */
    2421    private StatLog _statLog;
     
    2825        _description = description;
    2926        _groupName = group;
    30         _rates = new ConcurrentHashMap<Long, Rate>(4);
    31         for (int i = 0; i < periods.length; i++) {
    32             Rate rate = new Rate(periods[i]);
     27        if (periods.length == 0)
     28            throw new IllegalArgumentException();
     29       
     30        long [] periodsCopy = copyOf(periods, periods.length);
     31        sort(periodsCopy);
     32       
     33        _rates = new Rate[periodsCopy.length];
     34        for (int i = 0; i < periodsCopy.length; i++) {
     35            Rate rate = new Rate(periodsCopy[i]);
    3336            rate.setRateStat(this);
    34             _rates.put(rate.getPeriod(),rate);
     37            _rates[i] = rate;
    3538        }
    3639    }
     
    4245    public void addData(long value, long eventDuration) {
    4346        if (_statLog != null) _statLog.addData(_groupName, _statName, value, eventDuration);
    44         for (Rate r: _rates.values())
     47        for (Rate r: _rates)
    4548            r.addData(value, eventDuration);
    4649    }
     
    5356    public void addData(long value) {
    5457        if (_statLog != null) _statLog.addData(_groupName, _statName, value, 0);
    55         for (Rate r: _rates.values())
     58        for (Rate r: _rates)
    5659            r.addData(value);
    5760    }
     
    5962    /** coalesce all the stats */
    6063    public void coalesceStats() {
    61         for (Rate r: _rates.values()){
     64        for (Rate r: _rates)
    6265            r.coalesce();
    63         }
    6466    }
    6567
     
    7779
    7880    public long[] getPeriods() {
    79         long rv[] = new long[_rates.size()];
    80         int counter = 0;
    81         for (Rate r: _rates.values())
    82             rv[counter++] = r.getPeriod();
    83         Arrays.sort(rv);
     81        long [] rv = new long[_rates.length];
     82        for (int i = 0; i < _rates.length; i++)
     83            rv[i] = _rates[i].getPeriod();
    8484        return rv;
    8585    }
    8686
    8787    public double getLifetimeAverageValue() {
    88         if (_rates.isEmpty()) return 0;
    89         return _rates.values().iterator().next().getLifetimeAverageValue();
     88        return _rates[0].getLifetimeAverageValue();
    9089    }
    9190    public long getLifetimeEventCount() {
    92         if (_rates.isEmpty()) return 0;
    93         return _rates.values().iterator().next().getLifetimeEventCount();
     91        return _rates[0].getLifetimeEventCount();
    9492    }
    9593
     
    10199     */
    102100    public Rate getRate(long period) {
    103         //if (_rates.containsKey(period)){
    104                 return _rates.get(Long.valueOf(period));
    105         //} else {
    106         //      Rate rate = new Rate(period);
    107         //      rate.setRateStat(this);
    108         //      _rates.put(period, rate);
    109         //      return rate;
    110         //}
     101        for (Rate r : _rates) {
     102            if (r.getPeriod() == period)
     103                return r;
     104        }
     105       
     106        return null;
     107    }
     108
     109    /**
     110     * Adds a new rate with the requested period, provided that
     111     * a rate with that period does not already exist.
     112     * @param period ms
     113     * @since 0.8.8
     114     */
     115    @Deprecated
     116    public void addRate(long period) {
     117        throw new UnsupportedOperationException();
    111118    }
    112119   
    113120    /**
    114      * Adds a new rate with the requested period, provided that
    115      * a rate with that period does not already exist.
     121     * If a rate with the provided period exists, remove it.
    116122     * @param period ms
    117123     * @since 0.8.8
    118124     */
    119     public void addRate(long period) {
    120         if (!_rates.containsKey(period)){
    121                 Rate rate = new Rate(period);
    122                 rate.setRateStat(this);
    123                 _rates.put(period, rate);
    124         }
    125     }
    126    
    127     /**
    128      * If a rate with the provided period exists, remove it.
    129      * @param period ms
    130      * @since 0.8.8
    131      */
     125    @Deprecated
    132126    public void removeRate(long period) {
    133         _rates.remove(period);
     127        throw new UnsupportedOperationException();
    134128    }
    135129   
     
    141135     */
    142136    public boolean containsRate(long period) {
    143         return _rates.containsKey(period);
     137        return getRate(period) != null;
    144138    }
    145139
     
    156150        buf.append(getGroupName()).append('.').append(getName()).append(": ").append(getDescription()).append('\n');
    157151        long periods[] = getPeriods();
    158         Arrays.sort(periods);
     152        sort(periods);
    159153        for (int i = 0; i < periods.length; i++) {
    160154            buf.append('\t').append(periods[i]).append(':');
     
    169163    public boolean equals(Object obj) {
    170164        if ((obj == null) || !(obj instanceof RateStat)) return false;
     165        if (obj == this)
     166            return true;
    171167        RateStat rs = (RateStat) obj;
    172168        if (DataHelper.eq(getGroupName(), rs.getGroupName()) && DataHelper.eq(getDescription(), rs.getDescription())
    173169            && DataHelper.eq(getName(), rs.getName())) {
    174             return this._rates.equals(rs._rates);
     170            return deepEquals(this._rates, rs._rates);
    175171        }
    176172       
     
    187183        out.write(buf.toString().getBytes());
    188184        buf.setLength(0);
    189         for (Rate r: _rates.values()){
     185        for (Rate r: _rates){
    190186            buf.append("#######").append(NL);
    191187            buf.append("# Period : ").append(DataHelper.formatDuration(r.getPeriod())).append(" for rate ")
     
    214210     */
    215211    public void load(Properties props, String prefix, boolean treatAsCurrent) throws IllegalArgumentException {
    216         for (Rate r : _rates.values()) {
     212        for (Rate r : _rates) {
    217213            long period = r.getPeriod();
    218214            String curPrefix = prefix + "." + DataHelper.formatDuration(period);
    219             try {
    220                 r.load(props, curPrefix, treatAsCurrent);
    221             } catch (IllegalArgumentException iae) {
    222                 Rate rate = new Rate(period);
    223                 rate.setRateStat(this);
    224                 _rates.put(rate.getPeriod(), rate);
    225                 Log log = I2PAppContext.getGlobalContext().logManager().getLog(RateStat.class);
    226                 if (log.shouldLog(Log.WARN))
    227                     log.warn("Rate for " + prefix + " is corrupt, reinitializing that period");
    228             }
     215            r.load(props, curPrefix, treatAsCurrent);
    229216        }
    230217    }
Note: See TracChangeset for help on using the changeset viewer.