mirror of
https://github.com/SquidDev-CC/CC-Tweaked
synced 2024-11-05 17:46:21 +00:00
Use ClassValue instead of LoadingCache
This should be significantly faster than LoadingCache (2.5x in my benchmarks, but not sure they're representative). This isn't super important - a lookup only takes 6us - but still worth using!
This commit is contained in:
parent
440fca6535
commit
7e5598d084
@ -4,9 +4,6 @@
|
|||||||
|
|
||||||
package dan200.computercraft.core.asm;
|
package dan200.computercraft.core.asm;
|
||||||
|
|
||||||
import com.google.common.cache.CacheBuilder;
|
|
||||||
import com.google.common.cache.CacheLoader;
|
|
||||||
import com.google.common.cache.LoadingCache;
|
|
||||||
import dan200.computercraft.api.lua.LuaFunction;
|
import dan200.computercraft.api.lua.LuaFunction;
|
||||||
import dan200.computercraft.api.lua.MethodResult;
|
import dan200.computercraft.api.lua.MethodResult;
|
||||||
import dan200.computercraft.api.peripheral.PeripheralType;
|
import dan200.computercraft.api.peripheral.PeripheralType;
|
||||||
@ -23,7 +20,6 @@ import java.lang.reflect.Modifier;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.ExecutionException;
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
import static dan200.computercraft.core.asm.Generator.catching;
|
import static dan200.computercraft.core.asm.Generator.catching;
|
||||||
@ -36,9 +32,14 @@ final class MethodSupplierImpl<T> implements MethodSupplier<T> {
|
|||||||
private final IntCache<T> dynamic;
|
private final IntCache<T> dynamic;
|
||||||
private final Function<Object, String[]> dynamicMethods;
|
private final Function<Object, String[]> dynamicMethods;
|
||||||
|
|
||||||
private final LoadingCache<Class<?>, List<NamedMethod<T>>> classCache = CacheBuilder
|
private final ClassValue<List<NamedMethod<T>>> classCache = new ClassValue<>() {
|
||||||
.newBuilder()
|
private final Function<Class<?>, List<NamedMethod<T>>> getter = catching(MethodSupplierImpl.this::getMethodsImpl, List.of());
|
||||||
.build(CacheLoader.from(catching(this::getMethodsImpl, List.of())));
|
|
||||||
|
@Override
|
||||||
|
protected List<NamedMethod<T>> computeValue(Class<?> type) {
|
||||||
|
return getter.apply(type);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
MethodSupplierImpl(
|
MethodSupplierImpl(
|
||||||
List<GenericMethod> genericMethods,
|
List<GenericMethod> genericMethods,
|
||||||
@ -93,12 +94,7 @@ final class MethodSupplierImpl<T> implements MethodSupplier<T> {
|
|||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
List<NamedMethod<T>> getMethods(Class<?> klass) {
|
List<NamedMethod<T>> getMethods(Class<?> klass) {
|
||||||
try {
|
return classCache.get(klass);
|
||||||
return classCache.get(klass);
|
|
||||||
} catch (ExecutionException e) {
|
|
||||||
LOG.error("Error getting methods for {}.", klass.getName(), e.getCause());
|
|
||||||
return List.of();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<NamedMethod<T>> getMethodsImpl(Class<?> klass) {
|
private List<NamedMethod<T>> getMethodsImpl(Class<?> klass) {
|
||||||
@ -148,5 +144,4 @@ final class MethodSupplierImpl<T> implements MethodSupplier<T> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user