代码优化=为什么我的代码运行这么慢?

问题描述 投票:0回答:1
@Service
public class LogServiceImpl implements LogService {

    public static final String LOG_FILE_NAME = System.getenv("LOG_FILE_NAME");
    private static final String LOG_PATTERN = "(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2},\\d+ [+-]\\d{4}) \\[([^\\]]+)\\] ([A-Z]+)\\s*\\(([^:]+:\\d+)\\) - (.*)";

    private final Logger logger = Logger.getLogger(LogServiceImpl.class);


    private String getLogString() {
        String logString;
        try {
            logString = new String(Files.readAllBytes(Paths.get(LOG_FILE_NAME)));
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        return logString;
    }

    @Override
    public LogsResponseModel getLogs(LocalDateTime startDate, LocalDateTime endDate, int limit, int offset, List<TypeOfLog> typeList, String searchString) {
        List<LogModel> logModels = parseLogs(getLogString());


        int countBeforeFiltering = logModels.size();

        logModels = logModels.stream()
                .filter(log -> log.getTimestamp().isAfter(startDate) && log.getTimestamp().isBefore(endDate))
                .collect(Collectors.toList());

        if (typeList != null && !typeList.isEmpty()) {
            logModels = logModels.stream()
                    .filter(log -> typeList.stream().anyMatch(type -> log.getLogLevel().equals(type.value())))
                    .collect(Collectors.toList());
        }

        if (searchString != null && !searchString.isEmpty()) {
            logModels = logModels.stream()
                    .filter(log -> log.toString().contains(searchString))
                    .collect(Collectors.toList());
        }

        int count = logModels.size();

        int fromIndex = Math.min(offset, logModels.size());
        int toIndex = Math.min(offset + limit, logModels.size());
        logModels = logModels.subList(fromIndex, toIndex);

        return new LogsResponseModel(count, logModels);
    }


    private List<LogModel> parseLogs(String logString) {
        List<LogModel> logs = new ArrayList<>();
        Pattern pattern = Pattern.compile(LOG_PATTERN);
        Matcher matcher = pattern.matcher(logString);
        while (matcher.find()) {
            LocalDateTime dateTime = LocalDateTime.parse(matcher.group(1), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss,SSS Z"));
            LogModel logEntry = new LogModel(dateTime, matcher.group(3), matcher.group(4), matcher.group(2), matcher.group(5));
            logs.add(logEntry);
        }
        return logs;
    }
}

我有这个代码。对于 50mb 文件,它的工作时间约为 1.5 秒。

对于我的需求,它应该工作得更快。

我相信最慢的地方是从文件中读取字符串,但我无法通过docker容器来分析它

有什么建议可以让它更快吗?

java string performance optimization pattern-matching
1个回答
0
投票

如果您有多核处理器,请尝试使用 .parallelStream() 而不是 .stream()

© www.soinside.com 2019 - 2024. All rights reserved.