for循环如何提高效率

问题遇到的现象和发生背景

for循环如何提高效率

问题相关代码,请勿粘贴截图
 HyBasicsMaterial hyBasicsMaterial = new HyBasicsMaterial();
        //查询物料表里面的包规,得出需要多少张条形码
        Long supplierCodeSum = hyBarCodeTem.getCustomerMaterialSum();
        //获取物料包规
        String customerMaterialCode = hyBarCodeTem.getCustomerMaterialCode();
        hyBasicsMaterial.setCustomerMaterialCode(customerMaterialCode);
        HyBasicsMaterial hyBasicsMaterial1 = hyBasicsMaterialService.selectHyBasicsMaterial(hyBasicsMaterial);
        //包规数量
        String materialSku = hyBasicsMaterial1.getMaterialSku();
        List batchList = new ArrayList();
        long num = 0;
        Long valueOf = Long.valueOf(materialSku);
        //如果是整数
        long l = System.currentTimeMillis();
        if (supplierCodeSum % valueOf == 0) {
            num = supplierCodeSum / valueOf;
            for (long i = 0; i < num; i++) {
                HyBarCodeTem saveItem = HyBarCodeTem.builder().build();
                saveItem.setCustomerMaterialCode(hyBarCodeTem.getCustomerMaterialCode());
                saveItem.setCreateTime(DateUtils.getNowDate());
                saveItem.setCustomerMaterialCodeNo(materialSku);
                saveItem.setIsValid("0");
                batchList.add(saveItem);
            }
        } else {
            //如果有零头
            num = supplierCodeSum / valueOf + 1;
            for (long i = 0; i < num; i++) {
                HyBarCodeTem saveItem = HyBarCodeTem.builder().build();
                saveItem.setCustomerMaterialCode(hyBarCodeTem.getCustomerMaterialCode());
                saveItem.setCreateTime(DateUtils.getNowDate());
                saveItem.setIsValid("0");
                if (i == num - 1) {
                    saveItem.setCustomerMaterialCodeNo(String.valueOf(supplierCodeSum % valueOf));
                } else {
                    saveItem.setCustomerMaterialCodeNo(materialSku);
                }
                batchList.add(saveItem);
            }
        }
        List list = new ArrayList<>();
        // batchList 为空不能保存
        this.saveBatch(batchList);
        for (HyBarCodeTem barCodeTem : batchList) {
            Map map = new HashMap<>();
            Long id = barCodeTem.getId();
            map.put("id", id);
            list.add(map);
        }
        long l1 = System.currentTimeMillis();
        System.out.println("运行时间:"+(l1 - l)+ "ms");

运行结果及报错内容

img

我的解答思路和尝试过的方法

200条大概要10s左右,如果多的话,时间更长,请问有啥提高效率的方法吗

  1. 先找到时间耗时长的地方,分析其原因,分析其是不是要做网络请求之类
  2. 考虑 for 循环之间有没有依赖关系,可不可以并行化,每个循环之间会不会相互冲突
  3. 如果可以并行化,用 parallelStream 或者用 ThreadPool 把这里并行化处理即可。

一般情况下,在MybatisPlus中使用saveBatch方法进行批量保存只需要:在数据库连接串中添加&rewriteBatchedStatements=true,并将MySQL驱动保证在5.0.18以上即可。