gpt4 book ai didi

java - Class.forName() 缓存

转载 作者:太空狗 更新时间:2023-10-29 23:03:56 26 4
gpt4 key购买 nike

在我的一个应用程序中,我使用了以下内容:

public void calculate (String className)
{
...
Class clazz = Class.forName(className);
...
}

这个函数每秒被调用几次。大约有 10 个可能的类名。虽然我确实意识到这个函数中有一些内部缓存,我认为这种缓存仅在 native 级别可用。

出于这个原因,我开始考虑是否应该添加自己的缓存。

private static Map<String,Class> classMap;

public void calculate (String className)
{
...
Class clazz = classMap.get(className);
if (clazz == null)
{
clazz = Class.forName(className);
if (classMap == null) classMap = new HashMap<String, Class>(40);
classMap.put(className, clazz);
}
...
}

这会带来性能提升还是真的没有区别?

提前致谢

最佳答案

我写了一个小脚本来计算这两个函数的执行时间。

这是我使用的主类。

public class Benchmark
{
public static void main(String... pArgs)
{
// prepare all data as much as possible.
// we don't want to do this while the clock is running.
Class[] classes = {Object.class, Integer.class, String.class, Short.class, Long.class, Double.class,
Float.class, Boolean.class, Character.class, Byte.class};
int cycles = 1000000;
String[] classNames = new String[cycles];
for (int i = 0; i < cycles; i++)
{
classNames[i] = classes[i % classes.length].getName();
}

// THERE ARE 2 IMPLEMENTATIONS - CLASSIC vs CACHING
Implementation impl = new Caching(); // or Classic();

// Start the clocks !
long startTime = System.currentTimeMillis();
for (int i = 0; i < cycles; i++)
{
impl.doStuff(classNames[i]);
}
long endTime = System.currentTimeMillis();

// calculate and display result
long totalTime = endTime - startTime;
System.out.println(totalTime);
}
}

这是使用 Class.forName 的经典实现

  private interface Implementation
{
Class doStuff(String clzName);
}

private static class Classic implements Implementation
{
@Override
public Class doStuff(String clzName)
{
try
{
return Class.forName(clzName);
}
catch (Exception e)
{
return null;
}
}
}

这是使用 HashMap 缓存 Class 对象的第二个实现。

  private static class Caching implements Implementation
{
private Map<String, Class> cache = new HashMap<String, Class>();

@Override
public Class doStuff(String clzName)
{
Class clz = cache.get(clzName);
if (clz != null) return clz;
try
{
clz = Class.forName(clzName);
cache.put(clzName, clz);
}
catch (Exception e)
{
}
return clz;
}
}

结果:

  • 1100 毫秒,无缓存。
  • 只有 15 毫秒的缓存。

结论:

  • 是否有显着差异 --> 是的!
  • 这对我的申请重要吗 --> 一点都不重要。

关于java - Class.forName() 缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18231991/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com