40 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.util.profiling.jfr.stats;
 | |
| 
 | |
| import com.google.common.base.MoreObjects;
 | |
| import java.time.Duration;
 | |
| import java.time.Instant;
 | |
| import java.util.List;
 | |
| import java.util.Map;
 | |
| import java.util.TreeMap;
 | |
| import java.util.stream.Collectors;
 | |
| import jdk.jfr.consumer.RecordedEvent;
 | |
| import jdk.jfr.consumer.RecordedThread;
 | |
| 
 | |
| public record ThreadAllocationStat(Instant timestamp, String threadName, long totalBytes) {
 | |
| 	private static final String UNKNOWN_THREAD = "unknown";
 | |
| 
 | |
| 	public static ThreadAllocationStat from(RecordedEvent event) {
 | |
| 		RecordedThread recordedThread = event.getThread("thread");
 | |
| 		String string = recordedThread == null ? "unknown" : MoreObjects.firstNonNull(recordedThread.getJavaName(), "unknown");
 | |
| 		return new ThreadAllocationStat(event.getStartTime(), string, event.getLong("allocated"));
 | |
| 	}
 | |
| 
 | |
| 	public static ThreadAllocationStat.Summary summary(List<ThreadAllocationStat> stats) {
 | |
| 		Map<String, Double> map = new TreeMap();
 | |
| 		Map<String, List<ThreadAllocationStat>> map2 = (Map<String, List<ThreadAllocationStat>>)stats.stream()
 | |
| 			.collect(Collectors.groupingBy(threadAllocationStat -> threadAllocationStat.threadName));
 | |
| 		map2.forEach((string, list) -> {
 | |
| 			if (list.size() >= 2) {
 | |
| 				ThreadAllocationStat threadAllocationStat = (ThreadAllocationStat)list.get(0);
 | |
| 				ThreadAllocationStat threadAllocationStat2 = (ThreadAllocationStat)list.get(list.size() - 1);
 | |
| 				long l = Duration.between(threadAllocationStat.timestamp, threadAllocationStat2.timestamp).getSeconds();
 | |
| 				long m = threadAllocationStat2.totalBytes - threadAllocationStat.totalBytes;
 | |
| 				map.put(string, (double)m / l);
 | |
| 			}
 | |
| 		});
 | |
| 		return new ThreadAllocationStat.Summary(map);
 | |
| 	}
 | |
| 
 | |
| 	public record Summary(Map<String, Double> allocationsPerSecondByThread) {
 | |
| 	}
 | |
| }
 |