java - 如何提高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();
}
}
解决方案
这里的复杂性不是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();
}
}
推荐阅读
- reactjs - store.getState() 在 index.js 中返回空值
- angular - 迁移到 Angular 12 后 Cytoscape.js“超出最大调用堆栈大小”错误
- jquery - 反转div内儿童的计数
- magento - 为什么 default_head_blocks.xml 不删除 css 文件?
- pandas - 如何使用文档短语在 Spacy 中拆分并提取特定单词
- reactjs - reactjs - 如何在react js中显示路径在json文件中的图像?
- python - 元标记显示在 While 应该放在
- c++ - PPP Stroustrup 练习 - 将 C 风格的字符串复制到它在自由存储上分配的内存中
- azure - 为 Azure 数据工厂链接服务创建多个环境参数
- azure-pipelines - 如何从组织的所有 azure DevOps 项目中提取版本