反射屬性拷貝與Set方法性能比較

反射+Set測試

使用的類:org.springframework.beans.BeanUtils

代碼

@Test
public void test() {
    PriceAdjustBean adjustBean = new PriceAdjustBean();
    adjustBean.setSkuId(111111);
    adjustBean.setOrderId("ST2019070112064948900018");
    adjustBean.setAdjustedPrice(100000L);
    adjustBean.setAdjustedType(1);

    long now = System.currentTimeMillis();
    int count = 10000;
    System.out.println("循環次數:" + count);
    for (int i = 0; i < count; i++) {
        OrderPriceAdjustment orderPriceAdjustment = new OrderPriceAdjustment();
        BeanUtils.copyProperties(adjustBean, orderPriceAdjustment);
    }
    long after = System.currentTimeMillis();
    System.out.println("反射耗時:" + (after - now));
    for (int i = 0; i < count; i++) {
        OrderPriceAdjustment orderPriceAdjustment = new OrderPriceAdjustment();
        orderPriceAdjustment.setOrderId(adjustBean.getOrderId());
        orderPriceAdjustment.setSkuId(adjustBean.getSkuId());
        orderPriceAdjustment.setAdjustedType(adjustBean.getAdjustedType());
        orderPriceAdjustment.setAdjustedPrice(adjustBean.getAdjustedPrice());
    }
    long result = System.currentTimeMillis();
    System.out.println("set 耗時:" + (result - after));
}

結果

循環次數 反射耗時(ms) Set耗時(ms)
10 506 0
100 487 1
1000 458 0
2000 493 0
4000 573 2
8000 541 3
10000 553 6

結論

Set方法的耗時明顯少於反射處理的耗時。

在上述數據集的結果中可以看出,這種反射的處理,耗時還是非常明顯的,即使在數據量很少的情況下,這種處理方式代碼無疑顯得很整齊簡潔,但是效率太低,不提倡。另外,BeanUtils的拷貝,寫的簡潔,導致其實在執行完之後,我們不能很明顯的知道究竟多少屬性被拷貝了。

不可一味的爲了追求代碼的簡潔,忽略了性能的問題。往往比較嚴重的性能問題都是由這種小問題堆積而來的。

防微杜漸。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章