在速度方面,有哪些通用方法可以优化Java中的程序。我使用DOM Parser来解析XML文件,然后将某些单词存储在ArrayList中,删除所有重复项,然后通过为每个单词创建Google搜索URL拼写检查这些单词,获取html文档,找到更正的单词并将其保存到另一个ArrayList。
任何帮助将不胜感激!感谢。
答案 0 :(得分:3)
SAX比DOM快。如果您不想通过ArrayList搜索重复项,请将所有内容放在LinkedHashMap中 - 没有重复项,您仍然可以获得ArrayList为您提供的插入顺序。
但真正的瓶颈是向Google发送HTTP请求,等待响应,然后解析响应。请使用拼写检查库。
编辑:但是接受我的教育猜测。使用代码分析器来查看实际上正在减慢程序的速度。
答案 1 :(得分:3)
为什么需要提高性能?根据您的解释,很明显,这里的大瓶颈(或性能损失)将是 IO ,因为您正在访问网址。< / p>
这肯定会使数据结构或XML框架中的任何微小改进相形见绌。
一般的经验法则是,您的大型性能问题将涉及IO。非常幽默,此时等待数据库查询在批处理过程中返回。它已经运行了将近一个小时。但我欢迎对我的XML解析库提出任何建议的改进!
以下是我的一般方法:
您的程序是否从延迟(IO)的角度执行任何明显昂贵的任务?你有足够的日志记录,看看这是延迟的地方(如果有意义的话)?
你的程序是否容易发生锁定争用(即它可以等待,什么也不做,等待某些资源“免费”)? 也许你正在锁定整个Map
,同时对要存储的值进行昂贵的计算,阻止其他线程访问地图
是否存在一些可能具有较差特征的明显算法(可能用于数据匹配或排序)?
运行一个分析器(例如jvisualvm
,它随JDK本身提供)并查看代码热点。 JVM在哪里花时间?
答案 2 :(得分:1)
通常,最好的方法是找出瓶颈所在并修复它。您通常会发现您将90%的时间花在代码的一小部分上,而这正是您希望集中精力的地方。
一旦你弄清楚需要花费大量时间的事情,请专注于改进算法。例如,如果您使用最明显的算法,从ArrayList中删除重复项可能是O(n²)复杂度,但如果您利用正确的数据结构,则可以将其减少为O(n)。
一旦你弄清楚代码的哪些部分占用了大部分时间,而你无法弄清楚如何最好地修复它,我建议缩小你的问题并在StackOverflow上发布另一个问题。< / p>
修改强>
正如@oxbow_lakes如此讽刺地说,并非所有性能瓶颈都可以在代码的大O特性中找到。我当然无意暗示他们是。由于问题是关于优化的“一般方法”,我试图坚持一般的想法,而不是谈论这个特定的程序。但是这里是你如何将我的建议应用于这个特定的程序:
由于大部分时间花在“ping Google”阶段,因此解决此问题的一个明显方法是避免执行该步骤超过必要时间。例如:
当然,在这种情况下,最大的速度提升可能是使用在同一台机器上运行的拼写检查程序,但这并不总是一个选项。例如,TinyMCE在浏览器中作为javascript程序运行,并且它不能将整个字典作为网页的一部分下载。因此,它将所有单词打包成一个不同的列表,并执行单个AJAX请求,以获取不在字典中的单词列表。
答案 3 :(得分:0)
这些人可能是正确的,但是一些random pauses肯定会“变成”,这就是为什么“。