2020-09-14 fastjson对象初始化clone和new set性能对比

@Test
	public void testFastJsonClone(){
		int forNumber = 3000;
		// 粗略测试 keysize >5之后性能会更有优势
		int keySize = 5;


		long start2 = System.currentTimeMillis();
		JSONObject jsonObjectClone = new JSONObject();
		for (int i1 = 0; i1 < keySize; i1++) {
			jsonObjectClone.put(i1 + "", -999999L);
		}

		ArrayList<JSONObject> arrayList2  = new ArrayList<>();
		for (int i = 0; i < forNumber; i++) {
			// jsonObjectClone.clone() 是浅拷贝,如果需要深拷贝推荐还是用Set方式,或者工具类的深度拷贝方法.
			arrayList2.add((JSONObject)jsonObjectClone.clone());
		}

		long end2 = System.currentTimeMillis();


		System.out.println("testFastJsonClone"+(end2-start2));



	}
	@Test
	public void testFastJsonSet(){
		int forNumber = 3000;
		// 粗略测试 keysize <5之后性能相对clone方式会更有优势
		int keySize = 5;
		long start1 = System.currentTimeMillis();
		ArrayList<JSONObject> arrayList1  = new ArrayList<>();
		for (int i = 0; i < forNumber; i++) {
			JSONObject jsonObject = new JSONObject();
			for (int i1 = 0; i1 < keySize; i1++) {
				jsonObject.put(i1 + "", -999999L);
			}
			arrayList1.add(jsonObject);
		}
		long end1 = System.currentTimeMillis();


		System.out.println("testFastJsonSet=="+(end1-start1));
	}
	@Test
	public void testFastJsonSet2(){
		int forNumber = 3000;
		int keySize = 5;
		long start1 = System.currentTimeMillis();
		String[] keyArray = {"0","1","2","3","4","5","6","7","8","9"};
		ArrayList<JSONObject> arrayList1  = new ArrayList<>();
		for (int i = 0; i < forNumber; i++) {
			JSONObject jsonObject = new JSONObject();
			for (int i1 = 0; i1 < keySize; i1++) {
				// 复用key的 set 方式比不复用key 性能跟内存消耗更好.
				jsonObject.put(keyArray[i1], -999999L);
			}
			arrayList1.add(jsonObject);
		}
		long end1 = System.currentTimeMillis();


		System.out.println("testFastJsonSet2=="+(end1-start1));
	}

总结

  1. 初始化对象key/属性较多(具体数值根据自己对象自行测试找到阈值),推荐使用clone方法来初始化对象.但是要注意是否需要深拷贝还是浅拷贝.如果需要深拷贝,可以使用序列化(可以找第三方工具包,因为Apache下的BeanUtils性能较差不建议使用,可以使用 Spring的BeanUtils,或者使用其他拷贝框架来尝试,但是深拷贝性能不佳!!!)
  2. 使用 set 方法时推荐复用key的String 来降低内存消耗和提高性能.
  3. 经同事复测补充:根据自己业务场景调整 forNumber 和 keySize 测试。本次测试数据量一般是3000所有forNumber使用的3000。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值