Middle of nowhere
眼球经济-剃须刀
http://www.brandmarketing.com.cn/
简单浏览,看到一篇讲剃须刀品牌“吉列”和“舒适”。昨天和她去屈臣氏也看到了两个牌子的刮胡刀。
“吉列”:刀片的战争:
http://www.brandmarketing.com.cn/article.asp?id=161
我记得上次长期使用安全剃须刀还是上大学的时候,大约有1年吧。那时总是把胡子留得比较长再清理,所以喜欢用安全剃须刀。可是后来由于发觉剃须应该是每天的习惯,所以慢慢开始用飞利浦的电动剃须刀。安全剃须刀也就移出视线了。
回想当初,我用的是两层刀片的吉列威风系列吧,银色的刀架,刀是两层的,一开始除了发现学习广告中那种顺畅的一刮到底会挂破皮肤外使用上应该是非常舒适的,主要原因是一开始使用的Gel啫哩(请注意,这个的拼音是Ze Li)刮胡泡,感觉非常舒服。可是用完后发现Gel的太贵5x一瓶,后来就用普通的绿色瓶的,发现效果的确差很多。再往后就不用了。其间我记得miniguan很风光的使用过March3风速3,跟我吹嘘多么的好用,我当时穷的要命,所以也不曾尝试过。
而今天看到上面引用的那篇文章里面所说的:“据说男人购买剃须刀的动机,除了锋利、快速、安全和干净等物理属性外,心理上的渴望是体现男子气概,并且大部分男人喜欢充满科技感的产品,难怪它们都不遗余力在小刀片上投入研发费用,不断推出称为有“革命”意义的新产品,充分满足男人自我欣赏的欲望。”
体会一下,也许使用安全剃须产品的确是为了满足男人的某些欲望吧。前一段时间陪她逛商场的时候也看到过须前水、须后爽肤水、须后护理水等等产品,价格不菲,这正说明了男人自恋的一方面,他们也是有这样的需求的。
就好像我以前用肥皂洗脸也很满足,但是现在我喜欢用她送的男士洗面奶。洗发水我现在也会注意味道和品牌。虽然这些念头大都只出现在把这些东西放到购物篮前的一刹那,但是这一点点自恋或者什么什么什么的动机也被精明的商家捕获了,他/她们开始使用眼球经济的各种手法……
此时的男人估计和女人对化妆品和名牌服装有类似的购买狂热,暂时忘记了什么性价比云云,而是纯粹进入一种对奢侈和满足感的赤裸裸的追求上面。这么说是夸张的,但是也许有那么xx%吧,这一小点感情变化带来的商机不可谓不巨大。我向手表、西装等等也
我不想废话了。反正我是想说男人肯定也会狂热,而且更热,发生一点点自恋什么的也是可能的。眼球经济此时如鱼得水,发育的非常好,让哪位投资者看了不眼馋?所以……下次买刀片刀架的时候想想笑笑,取你所需就好了不要脸红。
习惯改变,习惯新的习惯
Follow ZC:行业倾向测试
ZC又找了个测试,我也尝试了一下。他的标题是男怕入错行,女怕嫁错郎,这个……郎怎么测试呀? http://quizfarm.com/test.php?q_id=119158 You scored as Mathematics. You should be a Math major! Like Pythagoras, you are analytical, rational, and when are always ready to tackle the problem head-on!
What is your Perfect Major? (PLEASE RATE ME!!<3) |
[ZT]傻子
嘿!请不要突击享受!

体验经济与牙膏
Webwork 2.2的Action是否使用Spring的prototype获取的性能对比
本文在060216进行了修改,因为发现了测试中的错误!注意5.5和7的内容。
1、引子:
其实是ajoo的这篇“Nuts和Spring 1.2.6 效率对比”和“IoC容器的prototype性能测试 ”,他们在Javaeye上详细讨论了Spring的prototype的缺陷。
Spring的prototype指的就是singleton="false"的bean,具体可以看Spring参考手册“3.2.5. To singleton or not to singleton”介绍。
2、Webwork 2.2的Spring结合问题:
Webwork 2.2已经抛弃自己的IoC,默认使用Spring的IoC。
上在OpenSymphony的官方Wiki,和jscud后来的几篇文章中没有特别提出prototype的问题。但是托他们的福,我们已经顺利的使Spring和Webwork良好的协同工作起来了。
可是而后的一些问题却把prototype的问题搞得神秘起来……
ajoo的测试中指出Spring的prototype性能很差,参见后面参考中的一篇文章和Javaeye的讨论。
而后又发现robbin在Javaeye的Wiki上面的“集成webwork和spring”中的最后注到:
“注意:目前并不推荐使用Spring来管理Webwork Action,因为对于prototype类型的bean来说,Spring创建bean和调用bean的效率是很低的!更进一步信息请看IoC容器的prototype性能测试”
这就使我们常用的Spring+Webwork2.2的连接中使用的prototype的问题被摆出来了。
我现在的项目中使用了prototype的方式将Webwork Action使用Spring进行显示的装配,我担心这个性能的问题会很严重,所以今天花了半天时间具体测试了一下。
3、Prototype VS autowire的解释:
我不知道怎么命名两种方式好,所以这里先做个解释:
spring的配置中Action会有个id,如:





我指的prototype方式就是在xwork中这样配置:

而autowire方式就是指在xwork中这样配置:

看起来相同,但其实不同(我以前发过帖子,其中说这几种方法都可,但是其实它们的机制是不同的。
4、Portotye和autowire在XWork的SpringObjectFactory中是如何运作的:
我们先看一下代码,就能明白两者的区别了:






























如果按照autowire配置会使用第二个buildBean方法,而prototype会使用第一个buildBean方法。
5、我的测试,首先测试SpringObjectFactory的理论效率:









































































重要的是测试结果:
**************************Used time:-16875
**************************Used time:-80500
**************************Used time:-12703(使用SpringProxyableObjectFactory()这个实现)
prototype是autowire运行时间的4.77X倍,十分可观。
5.5 巨大的反差,原来是我搞错了配置,发现了幕后黑手:
第二天,我又重新运行了5里面的测试。但是结果令人吃惊,运行了十多次,结果于昨天反差巨大,prototype方式获得的bean反而性能最快!
摘要两次测量结果
**************************Autowire Used time:-17578
**************************Prototype Used time:-7609
**************************Proxy Used time:-13063
———————————————–
**************************Autowire Used time:-17047
**************************Prototype Used time:-7609
**************************Proxy Used time:-12797
这是为什么呢?我百思不得其解,问题出在哪里呢?后来经过跟踪svn里面的提交纪录。我发现,我在昨天测试以后,把spring配置文件中的<beans default-autowire="autodetect">变成了<beans>。也就是没有打开自动检测的autowire!
而后就真相大白了。我有配置上default-autowire="autodetect"进行测试,结果:
**************************Autowire Used time:-16937
**************************Prototype Used time:-79750
**************************Proxy Used time:-12578
这和昨天的测试结果完全相同。也就是说我昨天写的4.77x的结果其实没有实际意义。倒是说明了Spring和Webwork集成的文章上面说的default-autowire="autodetect"是很坏的实践,即失去了name的灵活性也带来了巨大的性能损失。
而如果使用默认的Spring autowire配置下,prototype的性能已经很好了,实际上它工作起来应该是最快的。
6、在实际的Web项目中的性能对比:
我使用了我的一个小项目,就是反复调用一个action获取一个页面,其中有一个DAO注入。使用了JMeter进行了一个测试:2个线程,间隔0.5秒,循环50次,对比“据和报告中的”Throughput,单位/sec。
使用autowire方式:Avg. 148.34(吞吐量越高越好)
使用prototype方式:Avg. 138.5
也就是说在实际应用中两者也是有性能差距的,后者大约是前者性能的93%。
具体代码我不放出了,因为意义不大,大家也可以自己动手试验一下。
补充说明:
首先注意这个测试是在default-autowire="autodetect"下进行的。
测试的这个Action其实是一个空Action,它没有调用service和DAO,只是直接return SUCCESS,然后dispatcher到一个静态内容的jsp页面。我的本意是为了能够在获取Action占据的时间比例比较高的情况下分析性能区别。但是实际上却间接的夸大了在真正的实际应用中的性能差距。实际应用中如果加上service、DAO等逻辑的执行时间、模板View的渲染时间还有广域网上的网络传输时间,那么获取Action实例的时间差距可能就微乎其微了。
7、后续:
经过今天的思考,可以说完全改变了想法,重新汇总一下:
a、在不使用default-autowire="autodetect"时,Webwork 2.2的xwork中的action class使用spring的bean id配置的理论性能最好。而且,我认为如果不是为了追求配置上的简单,严重推荐关闭spring的default-autowire。
b、在使用default-autowire="autodetect、name、class"时,需要考虑你的需求。如果不使用Spring AOP提供的功能则在Webwork 2.2的xwork中的action class使用class全名比较好。如果使用Spring AOP的功能,则还是使用bean id。
c、在Spring中是否使用default-autowire是个需要慎重考虑的问题。autowire如果打开,命名会受到限制(class则更不推荐,受限更大,参考相关文档),它所带来的配置简化我认为只算是小小的语法糖果,背后却是吃掉它所埋下的隐患。
d、6中的测试还是有些说明意义的。7%的性能差距是在使用了default-autowire的方式下得出的,其中测试的那个action其实没有执行什么逻辑,而是一个直接dispatcher到success view的action,如果有商业逻辑包装,则性能差据估计会更小。因为实际上Action的执行过程、service、DAO等逻辑的执行过程和模板View的渲染过程(网络延迟)才是耗时大户。所以,关于性能应该下的结论是,prototype与否,在实际应用中性能差距是很小的,基本可以忽略不计。我们讨论的更多是编码的更好的实践。
e、autowire不使用Spring AOP相对还是trade off,因为虽然配置简单一点,但是对于使用Spring的声明性事务等内容会带来麻烦。虽然XML不那么好,但是显示配置带来的好处还是很多的。
f、谢谢robbin的提示。关于事务我也是无奈,放弃Action事务后难道给DAO多封装一层事务?如何没有事务依然使用HibernateDAOSurpport?Acegi的确不适合Web,使用WW的Inteceptor可以实现更舒适的解决方案。
g、SpringProxyableObjectFactory的问题……使用上难道只能改代码?找了半天没有这个东西的介绍。看来还是需要看看代码。不过发现现在Webwork和Xwork的代码又变动了很多……
h、我的测试是在Webwork2.2+Spring 1.2.6环境下测试的
8、参考资源:
Nuts和Spring 1.2.6 效率对比
http://www.javaeye.com/pages/viewpage.action?pageId=786
IoC容器的prototype性能测试
http://forum.javaeye.com/viewtopic.php?t=17622&postdays=0&postorder=asc&start=0
JavaEye的Wiki:集成webwork和spring
http://www.javaeye.com/pages/viewpage.action?pageId=860
WebWork – Spring官方Wiki
http://www.opensymphony.com/webwork/wikidocs/Spring.html
webwork2 + spring 结合的几种方法的小结
http://forum.javaeye.com/viewtopic.php?t=9990
WebWork2.2中结合Spring:"新的方式"
http://www.blogjava.net/scud/archive/2005/09/21/13667.html
我为什么不推荐对Action进行事务控制
http://www.javaeye.com/pages/viewpage.action?pageId=1205
我为什么不推荐使用Acegi
http://www.javaeye.com/pages/viewpage.action?pageId=1199
关于存储过程和直接执行SQL对比
需要注意以下几点:
1、从数据库角度,存储过程总是要比它所对应的纯SQL要慢。
2、存储过程目的在于简化特别复杂的SQL复合应用的场景。
3、但是对于一个拥有多条SQL的存储过程来说,它可以提升效率。因为减少了SQL传输的网络延迟。所以说SQL复杂时,存储过程可以增加实际的运行效率。注意对比第1条,第一条是对应服务器调用,这条对应实际的网络环境。
4、还有就是存储过程很容易减少多条SQL之间数据传递的麻烦(有可能带来没有实际意义的中间变量),可以在服务器端把它们隐藏。
所以我想应该考虑这几点来选择存储过程:
1、拥有复杂的数据操作,需要SQL复合。
2、中间传递的临时数据过多或者过大的时候。
// CallableStatement cstmt = conn.prepareCall("begin ? := md5( ? ); end;"); // oracle syntax
cstmt.registerOutParameter(1, Types.VARCHAR); // set out parameters
cstmt.setString(2, "idea"); // set in parameters
cstmt.execute();
String md5Str = cstmt.getString(1); // Getting OUT Parameter Values
cstmt.close();