Skip to content

Commit

Permalink
Reimplement chunk profiling. Fixes #89
Browse files Browse the repository at this point in the history
  • Loading branch information
LunNova committed Mar 1, 2018
1 parent dd2d6f4 commit 17952a5
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 14 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package org.minimallycorrect.tickprofiler.minecraft.commands;

import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import lombok.val;

Expand Down Expand Up @@ -65,7 +68,7 @@ private void process(final ICommandSender commandSender, List<String> arguments)

val profile = type.create();
try {
profile.start(targets, p);
profile.start(commandSender, targets, p);
} finally {
profile.closeIfNeeded();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package org.minimallycorrect.tickprofiler.minecraft.profiling;

import java.util.*;
import java.util.concurrent.atomic.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;

import lombok.EqualsAndHashCode;
import lombok.val;
Expand All @@ -14,6 +16,8 @@

import net.minecraft.entity.Entity;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ITickable;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.WorldProvider;
import net.minecraft.world.WorldServer;
Expand All @@ -28,19 +32,23 @@ public class EntityProfiler extends Profile {
private static final AtomicLong totalTime = new AtomicLong();
private static long startTick;
private static long startTime;
private static int chunkX;
private static int chunkZ;

private static int getDimension(TileEntity o) {
val world = o.getWorld();
//noinspection ConstantConditions
if (o.getWorld() == null)
if (world == null)
return -999;
WorldProvider worldProvider = o.getWorld().provider;
return worldProvider == null ? -999 : worldProvider.getDimension();
}

private static int getDimension(Entity o) {
if (o.world == null)
val world = o.world;
if (world == null)
return -999;
WorldProvider worldProvider = o.world.provider;
WorldProvider worldProvider = world.provider;
return worldProvider == null ? -999 : worldProvider.getDimension();
}

Expand All @@ -67,7 +75,24 @@ private static String niceName(Class<?> clazz) {
}

@UsedByPatch("entityhook.xml")
public static void record(Object o, long time) {
public static void record(ITickable e, long time) {
int chunkX = EntityProfiler.chunkX;
if (chunkX == Integer.MIN_VALUE || (posInChunk(((TileEntity) e).getPos(), chunkX, chunkZ)))
record_inner(e, time);
}

private static boolean posInChunk(BlockPos pos, int chunkX, int chunkZ) {
return pos.getX() >> 4 == chunkX && pos.getZ() >> 4 == chunkZ;
}

@UsedByPatch("entityhook.xml")
public static void record(Entity e, long time) {
int chunkX = EntityProfiler.chunkX;
if (chunkX == Integer.MIN_VALUE || (e.chunkCoordX == chunkX && e.chunkCoordZ == chunkZ))
record_inner(e, time);
}

private static void record_inner(Object o, long time) {
if (time < 0) {
time = 0;
}
Expand Down Expand Up @@ -245,12 +270,34 @@ public void start() {
// TODO: handle multiple entries, split by ','
worldList.add(DimensionManager.getWorld(Integer.parseInt(worlds)));
}
int cX = Integer.MIN_VALUE;
int cZ = Integer.MIN_VALUE;
val chunk = parameters.getString("chunk").toLowerCase();
switch (chunk) {
case "all":
// defaults are corrext
break;
case "current":
if (commandSender == null)
throw new IllegalArgumentException("Can't use 'current' as chunk when profiling not started by a command sender");
val pos = commandSender.getPosition();
cX = pos.getX() >> 4;
cZ = pos.getZ() >> 4;
break;
default:
throw new IllegalArgumentException("Unknown option for chunk: " + chunk);
}
int cXFinal = cX;
int cZFinal = cZ;

start(() -> {
for (World world_ : worldList) {
TickProfiler.instance.hookProfiler(world_);
}
startTick = TickProfiler.tickCount;
startTime = System.currentTimeMillis();
chunkX = cXFinal;
chunkZ = cZFinal;
}, () -> targets.forEach(it -> {
val tf = it.getTableFormatter();
writeStringData(tf, elements);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package org.minimallycorrect.tickprofiler.minecraft.profiling;

import java.io.*;
import java.nio.file.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
import java.io.File;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;

import javax.annotation.Nullable;

import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
Expand All @@ -20,6 +25,8 @@
import net.minecraft.command.ICommandSender;

public abstract class Profile {
@Nullable
ICommandSender commandSender;
List<ProfileTarget> targets;
Parameters parameters;
long startTime;
Expand All @@ -32,7 +39,8 @@ protected AtomicBoolean getRunning() {

public abstract void start();

public final void start(List<ProfileTarget> targets, Parameters p) {
public final void start(ICommandSender commandSender, List<ProfileTarget> targets, Parameters p) {
this.commandSender = commandSender;
this.targets = targets;
this.parameters = p;
startTime = System.nanoTime();
Expand Down Expand Up @@ -105,7 +113,7 @@ private void end() {
@RequiredArgsConstructor
public enum Types {
COUNT_ENTITIES("c", EntityCountingProfiler.class, Arrays.asList("worlds", "all", "elements", "10")),
ENTITIES("e", EntityProfiler.class, Arrays.asList("time", "30", "worlds", "all", "elements", "5")),
ENTITIES("e", EntityProfiler.class, Arrays.asList("time", "30", "worlds", "all", "elements", "5", "chunk", "all")),
PACKETS("p", PacketProfiler.class, Arrays.asList("time", "30", "elements", "5")),
UTILISATION("u", UtilisationProfiler.class, Arrays.asList("time", "30", "elements", "5")),
LOCK_CONTENTION("l", ContentionProfiler.class, Arrays.asList("time", "30", "elements", "5", "interval_ms", "23")),
Expand Down

0 comments on commit 17952a5

Please sign in to comment.