使用分析器是一种帮助我们找到要优化的代码的非常好的方式,但也有它的问题。
• 分析器无法告诉你有更高效的算法可以解决当前的计算性能问题。去优化一个低效的算
法只是浪费时间。
• 对于会执行许多不同任务的待优化的程序,分析器无法给出明确的结果。例如,一个
SQL 数据库在执行 insert 语句时和在执行 select 语句时所运行的代码是不一样的。因
此,当使用 insert 加载数据库时的热点代码,可能在数据库执行 select 语句的时候完
全不会被运行。除非在分析时会进行大量计算,否则请在测试中混合加载数据库操作和
查询数据库操作,使执行 insert 语句的代码在分析结果中不那么突出。
因此,要想容易地找出最热点的函数,请尽量一次仅优化一个任务。这对于分析整个程
序中的一个子系统在测试套件上的运行情况非常有帮助。不过,如果每次只优化一个任
务,那么也会引入另外一种不确定性:即它不一定会改善程序的整体性能。而实际上当
程序运行多个任务时,优化的效果可能就体现得不那么明显了。
当遇到 IO 密集型程序或是多线程程序时,分析器的结果中可能会含有误导信息,因为
分析器减去了系统调用的时间和等待事件的时间。不计算这些时间在理论上是完全合理
的,因为程序并不需要为这些等待时间负责。但是结果却是分析器可以告诉我们程序做
了多少事情,而不是花了多少实际时间去做这些事情。有些分析器不仅统计了函数调用
的次数,还计算出了每个函数的调用时间。如果函数调用次数非常多,意味着分析器可
能隐藏了实际时间。
分析器并不完美。有些优化可能性可能不会被分析出来,而且程序员在理解分析器的输出
结果时也可能会有问题。不过,对于许多程序来说,分析器的分析结果已经足够好了,不
需要再使用其他的优化方法了。