Является ли 25 мс типичным временем для создания подкласса ByteBuddy? - PullRequest
1 голос
/ 08 мая 2019

При создании моих прокси-серверов лучшее время, которое я вижу, составляет около 25 мс (процессор 3,2 ГГц). Я пытаюсь обрезать десятки миллисекунд при выполнении кода, так что интересно, это типично или я что-то не так делаю?

Я пытаюсь прокси-объект Hibernate с помощью ByteBuddy, вот настройка:

Спящий объект:

@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 раз в секунду, поэтому я стараюсь обрезать как можно больше жира.

Я не могу указать время, указанное в в таблице сравнения документов (885,983 - 5'408,329 нс) соответствуют моему опыту - хотя я отмечаю, что они указаны в качестве базовых Object таймингов подкласса.

1 Ответ

1 голос
/ 08 мая 2019

Создание загрузчика классов, вероятно, самая дорогая часть вашего измерения.В Hibernate классы фактически внедряются в загрузчик целевых классов, что сокращает некоторые расходы.Это также делается в бенчмарке, так как cglib и Javassist применяют подход по умолчанию для правильного сравнения.

Вы можете использовать стратегию внедрения, указав ClassLoadingStrategy.Default.INJECTION в качестве второго аргумента метода load.

...