25ms是创建ByteBuddy子类的典型时间吗?

时间:2019-05-08 00:12:58

标签: java byte-buddy

创建代理时,我看到的最佳时间约为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子类计时。

1 个答案:

答案 0 :(得分:1)

创建类加载器可能是测量中最昂贵的部分。在Hibernate中,实际上将类注入到目标类加载器中,从而削减了一些成本。在基准测试中也这样做,因为这是cglib和Javassist进行适当比较的默认方法。

您可以通过将ClassLoadingStrategy.Default.INJECTION指定为load方法的第二个参数来使用注入策略。