创建代理时,我看到的最佳时间约为25毫秒(3.2Ghz处理器)。我正在尝试从代码执行中减少数十毫秒,所以想知道这是否是典型的或者我做错了什么?
我正在尝试使用ByteBuddy代理Hibernate实体,这是设置:
休眠实体:
@Entity
@Table(name = "device")
public class Device implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private long id;
@Version
@Column(name = "version", nullable = false)
private int version;
// ... about 20 more annotated fields representing columns
代理创建:
private static ByteBuddy byteBuddy = new ByteBuddy();
// ...
private Device getProxy(long id) {
Device target = new Device();
// ... populates the target with necessary information
Device proxyDevice = byteBuddy
.subclass(Device.class)
.method(any()).intercept(to(new CatchAllInteceptor()))
.method(isGetter()
.or(isHashCode())
.or(isToString())
.or(isEquals()))
.intercept(to(target))
.make()
.load(this.getClass().getClassLoader())
.getLoaded()
.newInstance();
我是ByteBuddy的新手,所以很可能出现了明显的错误-例如,为了加快每次调用的目的而重用上述定义中的一些功能。该代码块每秒被调用1200次,因此我希望尽可能减少脂肪。
我无法记下the docs comparison table中的时间(885.983
-5'408.329 ns)符合我的经验-尽管我注意到这些被引用为基线Object
子类计时。
答案 0 :(得分:1)
创建类加载器可能是测量中最昂贵的部分。在Hibernate中,实际上将类注入到目标类加载器中,从而削减了一些成本。在基准测试中也这样做,因为这是cglib和Javassist进行适当比较的默认方法。
您可以通过将ClassLoadingStrategy.Default.INJECTION
指定为load
方法的第二个参数来使用注入策略。