one.xingyi.profile.ProfileImpl Maven / Gradle / Ivy
package one.xingyi.profile;
import one.xingyi.helpers.MapHelpers;
import one.xingyi.interfaces.INanoTime;
import one.xingyi.interfaces.RunnableWithExceptionE;
import one.xingyi.interfaces.SupplierWithExceptionE;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;
class ProfileImpl implements IProfile {
private final ConcurrentHashMap> map;
final INanoTime nanoTime;
public ProfileImpl(ConcurrentHashMap> map, INanoTime nanoTime) {
this.map = map;
this.nanoTime = nanoTime;
}
@Override
public String print() {
int nanosToMs = 1000000;
return MapHelpers.print(map, (k, v) -> "{count: " + v.mapAndAdd(pb -> pb.count.get(), Integer::sum) +
", time: " + v.mapAndAdd(pb -> pb.total.get(), Long::sum) / nanosToMs +
", avg: " + v.mapAndAdd(ProfileBucket::avg, Long::sum) / nanosToMs +
" " + "<10ms:" + v.lessThan10ms + ", <100ms:" + v.lessThan100ms + ", <1s:" + v.lessThan1s + ", <10s:" + v.lessThan10s + ", rest:" + v.rest + '}');
}
@Override
public T profileE(String name, SupplierWithExceptionE fn) throws E {
long start = nanoTime.nanoTime(); try {
return fn.get();
} finally {
add(name, nanoTime.nanoTime() - start);
}
}
@Override
public T profile(String name, Supplier fn) {
long start = nanoTime.nanoTime();
try {
return fn.get();
} finally {
add(name, nanoTime.nanoTime() - start);
}
}
@Override
public void run(String name, Runnable fn) {
long start = nanoTime.nanoTime(); try {
fn.run();
} finally {
add(name, nanoTime.nanoTime() - start);
}
}
@Override
public void runE(String name, RunnableWithExceptionE fn) throws E {
long start = nanoTime.nanoTime(); try {
fn.run();
} finally {
add(name, nanoTime.nanoTime() - start);
}
}
@Override
public void add(String name, long duration) {
boolean isIn = map.contains(name);
ProfileBuckets bucket = map.getOrDefault(name, ProfileBuckets.create());
ProfileBuckets.add(bucket, duration); if (!isIn) map.put(name, bucket);
}
@Override
public Map> getMs() {
return MapHelpers.map(map, (k, v) -> v.map(b -> b.avg() / 1000000));
}
@Override
public Map> getCounts() {
return MapHelpers.map(map, (k, v) -> v.map(b -> b.count.get()));
}
@Override
public Map getTotalCounts() {
return MapHelpers.map(getCounts(), (k, v) -> v.add(Integer::sum));
}
@Override
public Map getTotalAvg() {
return MapHelpers.map(getMs(), (k, v) -> v.add(Long::sum));
}
}
© 2015 - 2026 Weber Informatics LLC | Privacy Policy