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