解惑

解己之惑,解人之惑

标签:优化

Inner join的问题

这个是最近感觉最有成就的一个发现了。
我们的系统有一个存储过程执行一个很核心的查询功能,但是在某些情况下非常的慢,而且最近QA一直在做性能测试,每天发送大量的数据,导致系统的性能越来越慢,我原来也曾经优化过这个存储过程,建了很多索引,解决了那个时候管理员用户的问题,但是现在很多普通用户的问题更加的严重,经过调试发现第一步的查询非常的慢,打印出结果来发现那个查询会产生9千万条纪录,而且会使用多达6G的硬盘空间来存储临时数据,后来加了个distinct解决了空间问题,空间使用不到6M,但是速度还是很慢,使用Tuning Advisor优化也没有什么帮助,后来我想了下为什么会产生那么多相同的数据呢?仔细看了下SQL,发现它用6个表进行inner join,但是只从其中的四个表各取一个字段,我就把另外的两个表从inner join移到where条件了,查询时间从6分钟(问题最大的一个用户)减少到6秒,呵呵

Google面试题解说性能之总结

呵呵,说了这么多,到底怎么优化性能还是没有说多少,而且一个产品的代码比这个例子复杂得多,怎么才能优化产品代码呢?
很简单,找到性能瓶颈,而大部分的性能瓶颈都有一个特点:被执行的次数太多。一个耗时2分钟的操作,如果系统运行一天才需要运行一次,那么我们根本就不要去理会它,如果一个操作耗时2秒,但是一般运行一天它要被执行几千亿次,那么你就要小心了。
如何才能知道系统中的哪些代码被执行的次数最多呢?有很多工具可以,有的是挂到系统上一起运行,有的是可以单独运行,但是我推荐的方法就是使用单元测试工具和代码覆盖工具,运行所有的单元测试,查看代码覆盖报告中被执行的次数最多的那些语句,看看他们是否可以被优化,或者可以被减少执行的次数。
可以参考我以前的一些日志:
Ant+JUnit+Cobertura
成功提高20倍性能

很多情况下,找到性能的瓶颈并不是很困难,真正困难的是如何进行优化。这个没有通用的解决方法,只能结合具体的问题具体解决,一个大部分情况下有效的方法是使用某种缓存机制(实际上,我的第二个例子也是使用了缓存机制,把运算结果缓存了9次)。

  1. Google面试题解说性能之一:字符串运算VS数字运算

  2. Google面试题解说性能之二:分析问题

  3. Google面试题解说性能之三:不要小看循环中的任何一个语句

  4. Google面试题解说性能之四:优化无止境

  5. Google面试题解说性能之五:人比电脑聪明

  6. Google面试题解说性能之六:数学显神威

  7. Google面试题解说性能之七:缓存中间结果

  8. Google面试题解说性能之八:工欲善其事必先利其器

  9. Google面试题解说性能之总结

Google面试题解说性能之四:优化无止境

其实在例子二的基础上,我们进一步的分析,可以把缓存10个结果换成缓存100个结果,性能可以得到进一步提升:
public class GoogleFn {
private static int MAX = 13200000;

private static int MAX2 = MAX / 10;

private static int MAX3 = MAX2 / 10;

private static int count(int n) {
int count = 0;
while (n > 0) {
int mod = n % 10;
if (mod == 1)
count++;
n = n / 10;
}
return count;
}

阅读全文

优化tomcat

主要是修改http Connector的一些参数,我认为比较主要的有:
maxThreads:可以创建的用来处理请求的最大线程数,这个是在服务器负载没有完全发挥出来时可以调整的最重要的参数,默认是200,建议可以开到500左右。
bufferSize:请求的输入流的缓存大小,默认是2K,建议可以开到10K左右,特别是对于发布大文本内容而言。
connectionTimeout:连接超时的时间,默认是60秒,建议修改为20秒

© 2024 解惑

本主题由Anders Noren提供向上 ↑