突然有这么个想法,就写了段代码测试了下。在单线程下对Java里所有Map的性能测试,包括HashMap、Hashtable、LinkedHashMap、IdentityMap、TreeMap,没有测试WeakHashMap。
数据为<Integer, Integer>,范围在0~1千万,共1百万对数据,由Python的random.randint()自动生成。
测试的性能包括写入(put)、随机读(get)和遍历(foreach语法),也是Map这个数据结构最常用的三个操作。其中写入就是将这1百万对测试数据依次put一遍,随机读就是在上一步写入之后再按顺序get一遍。数据显示最后Map大小都为995012(当然IdentityMap的size是1百万),就是有近5000条重复的key。
阅读更多…
上一篇博文讲了Tomcat的系统架构,今天花了一天时间研究了下coyote的源码,大致对普通IO版本有所了解。被同学提醒后发现,Tomcat6已经支持异步IO了,但默认是普通IO版本,需要在Connector的protocol参数中定义为Http11NioProtocol才开启异步IO模式。
主要的代码,Socket的服务在org.apache.tomcat.util.net.JIoEndpoint类,解析处理HTTP请求在org.apache.coyote.http11包的Http11Protocol类和Http11Processor类,org.apache.catalina.connector.CoyoteAdapter负责连接Connector模块(coyote)和Container模块。
线程池默认用的JIoEndpoint类中的子类WorkerStack,若在server.xml配置使用了Executor,则使用org.apache.catalina.core.StandardThreadExecutor(对ThreadPoolExecutor的一层包装)。并发量高的情况下Executor的效率会高一些。 阅读更多…
在上一篇博文中说到因为电脑风扇坏了2天于是看完了《How tomcat works》译本,不过这本书是针对Tomcat4和5来讲的比较老了,然后再结合Tomcat6.0.26的源代码调试学习了总共一周的时间,算是大致将Tomcat6.0的一部分工作机制(JSP、JMX、安全管理等模块没研究)给搞清楚了。大概是因为平时基于Java的Web程序写的太多,对Tomcat这一块源码研究特别感兴趣,有时候为了想通一个问题兴奋地吃饭睡觉都在一直想,非常有动力并且也有效率,好久没有这种感觉了。
阅读更多…
大概两周前,周末在家一次玩dota的时候,电脑突然变卡然后自动关机,整个机器很烫,再开机黑屏显示FAN ERORR又自动关机,吓坏了赶紧让其温度冷却下来再开机倒又开起来了。知道是风扇出问题后,之后因为一直还能用也就懒得换,打游戏的时候特别小心调低CPU性能和屏幕亮度,但是CPU温度还是会飙到80°,很恐怖 [em82]。
然后直到上周六晚上也在打dota,温度也一直飙高,游戏也卡了,吓得直接退出游戏,然后第二天就再也开不了机了,每次都是FAN ERROR。 阅读更多…
日本电影其实看的很少(基本看的都是动漫…)但基本都挑着很有名那几部来看,也的确都很不错。这几部电影风格都很类似的,很清新很文艺的感觉,电影拍摄的色彩都很淡有点朦胧,人物都很少就那几个,然后剧情都会比较拖沓没有耐心也许都会看不下去,只有细细品味会觉得还蛮有意思。 阅读更多…
正常思维下,就会去判断一个矩形的每个点是否在另一个矩形中,然后衍生出4个判断,每个判断都要带上4对大于小于比较,甚是麻烦。
1
2
3
4
5
6
| boolean judgeOverlap(Rect A, Rect B){
for(Point p : all points in A){
if(p in B) return true;
}
return false;
} |
上面这段代码其实有一点问题,设A的左上右下点为A1和A2,B的为B1和B2,就是:A与B重叠不等价于judgeOverlap(A1, A2, B1, B2) == true (比如当B真包含于A时就返回false了),而是等价于judgeOverlap(A1, A2, B1, B2) == true || judgeOverlap(B1, B2, A1, A2) == true,这里很容易犯bug。
有一个更容易的方法来解决这个问题,反向思维也很容易,就是排除那些A和B不可能重叠的情况,就4种。
1
2
3
4
5
6
7
| boolean judgeOverlap(Rect A, Rect B){
if(A.right < B.left) return false;
if(A.left > B.right ) return false;
if(A.top < B.bottom) return false;
if(A.bottom > B.top) return false;
return true;
} |
现在项目中还在使用上面版本的代码跑着,觉得第二种方法应该没有问题但没有测试过也没有应用到项目中去实践。