我们有一个处理平面文件并(仅进行几次验证)插入数据库的系统。
这段代码:
//可以有800万行代码
for(String line: lines){
if (!Class.isBranchNoValid(validBranchNoArr, obj.branchNo)){
continue;
}
list.add(line);
}
isBranchNoValid
的定义:
//数组长度只能在2到5之间
public static boolean isBranchNoValid(String[] validBranchNoArr, String branchNo) {
for (int i = 0; i < validBranchNoArr.length; i++) {
if (validBranchNoArr[i].equals(branchNo)) {
return true;
}
}
return false;
}
验证是在行级别进行的(我们必须过滤或跳过数组中没有 branchNo
的行)。早些时候,情况并非如此(过滤器)。
现在,高性能退化正在困扰着我们。 我理解(可能是我错了)这种重复的函数调用会导致大量的堆栈创建,从而导致非常高的GC调用。
我想不出一种方法(是否有可能)来执行此过滤器而不会造成性能下降的高昂成本(有一点差异就可以了)。
最佳答案
这肯定不是堆栈问题,因为您的函数不是递归的,调用之间堆栈中不会保存任何内容;每次调用后,变量都会被删除,因为不再需要它们。
您可以将有效数字放入一组并使用该数字进行一些优化,但就您的情况而言,我不确定它会带来任何好处,因为您最多有 5 个元素。
关于Java性能问题: Need to iterate more than 8 million records with a target-branch check,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55939802/