首页 > 解决方案 > 如何提高java代码的性能?

问题描述

我想问如何提高代码性能?我需要获取所有 html 代码并将其保存在 Queue-LinkedList 中。但是在提取过程中,我使用了loop里面的loop O(n^2)。这太慢了。如何改进这段代码?

公共类 ParsingHtml {

private static Queue<Character> queueCharacter = new LinkedList<>();

public static void downloadHtmlCode(String addressUrl) throws IOException {

    InputStream is = null;
    try (BufferedReader bufferedReader =
                 new BufferedReader(new InputStreamReader(is = (new URL(addressUrl)).openStream()))) {
        bufferedReader.lines()
                .filter(str -> !str.isEmpty())
                .forEach(str -> {
                    for (char ch : str.toCharArray())
                        if (ch != ' ') queueCharacter.add(ch);
                });
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    is.close();
   }
}

标签: javalambda

解决方案


这里的复杂性不是O(n^2)。在您的代码中,您将每个符号读取两次,而不是n^2多次。第一次读取是当您读取行时,第二次是当您迭代该行中的符号时。这意味着复杂性是О(n)。您可以在一次阅读中做同样的事情:只需逐个字符地阅读 html 并在Queue阅读时输入这些字符。

private static Queue<Character> queueCharacter = new LinkedList<>();

public static void main(String[] args) {

    try (InputStream inputStream = new URL(addressUrl).openStream()) {
        BufferedReader buffer = new BufferedReader(new InputStreamReader(inputStream));
        int c = 0;
        while ((c = buffer.read()) != -1) {
            char character = (char) c;
            if (character != ' ' && character != '\n') {
                //filter space and endline symbol
                queueCharacter.add(character);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

推荐阅读