反射属性拷贝与Set方法性能比较

本文对比了使用反射和Set方法进行属性拷贝的性能,结果显示Set方法的耗时显著少于反射。虽然反射代码简洁,但在数据量小时性能劣势明显。在关注代码整洁的同时,也应注意性能问题,因为性能瓶颈往往是由于这些小问题积累造成的。然而,反射在框架中的通用代码仍有其应用价值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反射+Set测试

使用的类:org.springframework.beans.BeanUtils.copyProperties(source, target)

代码

@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)
14910
105060
1004871
10004580
20004930
40005732
80005413
100005536
10000091619
1000000199322

当前数据只是一次执行的结果,该方法底层做了一些其他的特殊处理,使得服务启动之后,一个类的属性拷贝,时间基本能维持的相对比较低。详情参见CachedIntrospectionResults类。

结论

Set方法的耗时明显少于反射处理的耗时。

在上述数据集的结果中可以看出,这种反射的处理,耗时还是非常明显的,即使在数据量很少的情况下,这种处理方式代码无疑显得很整齐简洁,但是效率太低,不提倡。另外,BeanUtils的拷贝,写的简洁,导致其实在执行完之后,我们不能很明显的知道究竟多少属性被拷贝了。

不可一味的为了追求代码的简洁,忽略了性能的问题。往往比较严重的性能问题都是由这种小问题堆积而来的,防微杜渐。

当然事无绝对,存在必然有一定的意义。在一些框架性的结构中的通用代码,还是会无可避免的使用到这种方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值