多数情况下,过早地优化会占用大量的时间,而且会使代码变得难以理解和阅读。更糟糕的是,这些优化通常并没带来任何好处,因为你花了大量的时间在优化应用中的非关键部分。
那么,要怎么证明东西需要优化呢?
首先,你需要定义你的代码速度得多快。例如,为所有API调用指定*响应时间,或者指定在特定时间范围内要导入的记录数量。在做完这些后,你需要确定你应用中哪些部分太慢需要改进。当完成这些后,你就可以来看看第二个技巧提示。
你可以有两种途径来解决这个问题:
查看你的代码,从看起来可疑的或者你觉得可能会导致出现问题的地方入手
或者使用分析器获取代码每个部分的行为(执行过程)和性能的详细信息。
希望我不需要解释为什么应该始终遵循第二种途径/方法的原因。
很显然,基于分析器的方式可以让你更好地理解代码的性能影响,并允许你去专注于更关键的部分(代码)。即使你曾经使用过分析器,你一定记得你曾经多么惊讶于一下就找到了代码的哪些部分产生了性能问题。我*次的猜测不止一次地导致我走错了方向。
这些额外的测试运行将帮助你识别你的改动所引起的功能和性能上的副作用,并确保不会导致弊大于利的更新。如果你处理的是被应用程序的多个不同部分使用的组件,如数据库或缓存,那这一点尤为重要。
速成方案一开始可能会很有吸引力,因为你可以很快显示*个成果。但有时,可能有必要说服其他团队成员或管理层认为性能分析是值得的。
一般来说,我建议从顶层开始,首先开始处理最重要的性能问题。这将为你提供*的性能改进,而且你可能仅需要解决这些问题中的一小部分就能满足你的性能要求。
常见的通用调优技巧到此结束。接下来让我们仔细看看一些特定于Java的技巧。
那么,你应该选择哪种方法呢?
答案取决于连接字符串的代码。如果你是以编程方式将新内容添加到字符串中,例如在for循环中,则应使用StringBuilder。它很易于使用,并提供比StringBuffer更好的性能。但请记住,与StringBuffer相比,StringBuilder不是线程安全的,可能并不适用于所有情况。
你只需要实例化一个新的StringBuilder并调用append方法来向String中添加一个新的部分。在你添加完了所有的部分后,你可以调用toString()方法来检索已连接的字符串。
下面的代码片段展示了一个简单的例子。在每次迭代期间,该循环将i转换为一个String,并将其与空格一起添加到StringBuilder sb中。所以,最后,这段代码在日志文件中写入“This is a test0 1 2 3 4 5 6 7 8 9”。
StringBuilder sb=new StringBuilder(“This is a test”);for(int i=0;i<10;i++){
sb.append(i);
sb.append(”“);
}
log.info(sb.toString());
正如你在我们的公众号Java技术栈代码片段中看到的,我们可以为字符串的*个元素提供到构造函数中。这会创建一个StringBuilder,其中包含了你所提供的字符串以及16个额外字符的容量。当你向StringBuilder中添加更多字符时,你的JVM将动态的增加StringBuilder的大小。
如果你已经知道字符串将包含多少个字符,则可以将该数字提供给不同的构造方法以实例化具有指定容量的StringBuilder。这进一步提高了效率,因为它不需要动态扩展其容量。