我刚刚意识到,从计算的角度来看,我不知道如何判断一段Java代码是否有效。阅读几个源代码有时我觉得我正在阅读的代码效率非常低,有时我觉得相反。
您能否列出基本的单行规则以及它们如此重要的原因?
编辑 - 我的问题与JVM的Java实现有关,所以像Java分配问题,字符串管理,异常处理,线程同步等等。
提前致谢
P.S。不要采取“单行”字面意思
答案 0 :(得分:8)
基本的一线规则?好的,你走了:
避免不必要的计算。
你是怎么做到的?对不起,没有一行答案。 :(
嗯,人们花了数年时间在大学里学习计算机科学中的算法和数据结构是有原因的......有时可能想要学习算法/数据结构课程。
我不确定你的意思是“从计算的角度来看”(它似乎意味着算法问题),但假设你的意思更像是类似于分析的技巧,试试这些:
运行程序,然后突然暂停,看看它暂停的位置。这样做几次;无论何时停止最多都是一个瓶颈,它停止的频率表明瓶颈有多严重。
避免装箱/拆箱(在int
和Integer
之间进行转换等);特别要避免Integer[]
,List<Integer>
以及内部存储基本类型对象数组的其他内容
排除常见代码(有时是速度问题,有时是可读性)
避免使用String
操作进行循环;请改用StringBuilder
/ StringBuffer
。 (简而言之,避免在不需要时创建和/或复制数据。)
如果想到其他事情,我会加入这个。
答案 1 :(得分:7)
使用profiling。查看JProfile或任何其他分析器。
答案 2 :(得分:4)
我将第二个Mherdad的答案,因为肯定没有“基本的单行规则。”
关于建议使用性能分析工具的答案,在了解算法时间复杂度和大O表示法之前,性能分析并不是很有用。来自维基百科的大{O}表示法article:
在数学,计算机科学和 相关领域,大O符号 描述了限制行为 参数倾向时起作用 特定价值或 无限,通常就简单而言 功能。大O符号 根据功能表征功能 他们的增长率:不同 具有相同增长率的功能 可以使用相同的O表示 符号
big-O表示法背后的想法是,它让您了解输入大小如何影响给定算法的执行时间。例如,请考虑以下两种方法:
void linearFoo(List<String> strings){
for(String s:strings){
doSomethingWithString(s);
}
}
void quadraticFoo(List<String> strings){
for(String s:strings){
for(String s1:strings){
doSomethingWithTwoStrings(s,s1);
}
}
}
linearFoo
被认为是O(n),意味着它的时间随输入大小n(即strings.size()
)线性增加。 quadraticFoo
被认为是O(n 2 ),这意味着执行quadraticFoo
所需的时间是strings.size()
平方的函数。
一旦你对程序的算法时间复杂度有所了解,分析工具就会开始变得有用。例如,您将能够告诉您,如果在分析时发现方法通常需要1ms来获得固定的输入大小,如果该方法为O(n),则将输入大小加倍将导致执行时间为2ms (1ms = n,因此2n = 2ms)。但是,如果它是O(n 2 ),则输入大小加倍意味着您的方法将花费大约4ms来执行(1ms = n 2 因此(2n) 2 = 4ms)。
答案 3 :(得分:3)
您可以使用jconsole
来监视应用程序的死锁,内存泄漏,线程和堆。简而言之,您可以在图表中看到应用程序的性能。
答案 4 :(得分:2)
如果你真的需要一个你应该在Java中遵循的规则列表,请查看Joshua Bloch的书Effective Java。本书不仅提供了性能指导,也提供了适当的Java编程方法。