关于LINQ,SqlDataReader, DataSet 以及LINQ Compiled Queries的性能对比
[ 大恐龙 发表于 2009年2月 9日 05:18 ]
开发web程序,性能为王,web应用就是要使用最简单的方法,最廉价的应用实现密集的计算,最近在用asp.net mvc写一个帖吧程序,喜欢mvc的不是为了别的,URL比较好看,终于可以像struts一样实现: http://doamin/board-11-page-1-0 这样比较漂亮的URL了。
遇到Linq,一直都对这样东西不以为然,当年就及其唾弃hibernate这样的架构,可能开发一般的企业应用可能比较适合,但是肯定不适合web,还不如用JDBC+类似JCS的key value缓存,主要是为了满足部分知识面窄的程序员搭车的需要。不过遇到了Linq不得不研究一下,因为不调查就没有发言权,试着做了几个demo,发现比asp.net MVC还是好很多的,写model比较顺手,Controller的编写也比较符合个人喜好。Html.Action和Struts里很像,很神奇的是URL的匹配模式可以自动转换,让匹配不到RouteMap规则的时候会自动变成?board=11&page=1,这个喜欢。
使用.net的原应就是.net的运行效率高java太多,一台windows的承受负荷比linux+jsp要高很多,在上一篇文章《.net的运行效率问题》讨论过。当然开发团队的素质还是决定性的,再好的架构都可能被写成焦油坑式的程序。看到一篇文章,对linq等几种数据访问的性能进行了对比:
Performance benchmarks for LINQ vs. SqlDataReader, DataSet - LINQ Compiled Queries: Part 2
我们这里只看数据,争论没用,用benchmark说话:
******************************
Run : 1
SQL Data Reader: 1,582 ms
LINQ to SQL: 6,045 ms
Strongly Typed DataSet: 2,785 ms
LINQ to SQL Compiled: 2,472 ms
******************************
Run : 2
SQL Data Reader: 1,556 ms
LINQ to SQL: 5,855 ms
Strongly Typed DataSet: 2,696 ms
LINQ to SQL Compiled: 2,432 ms
******************************
Run : 3
SQL Data Reader: 1,553 ms
LINQ to SQL: 5,859 ms
Strongly Typed DataSet: 2,730 ms
LINQ to SQL Compiled: 2,418 ms
-------------------------------------------------------------------
Data Access Type Run 1 Run 2 Run 3 Average
SQL Data Reader 1,582 1,556 1,553 1,563
LINQ to SQL 6,045 5,855 5,859 5,919
Strongly Typed DataSet 2,785 2,696 2,730 2,737
LINQ to SQL Compiled 2,472 2,432 2,418 2,440
-------------------------------------------------------------------
SQL Data Reader Breakdown
378.69% faster than LINQ to SQL
175.11% faster than Strongly Typed DataSet
156.11% faster than LINQ to SQL Compiled
-------------------------------------------------------------------
LINQ to SQL Breakdown
378.69% slower than SQL Data Reader
216.26% slower than Strongly Typed DataSet
242.58% slower than LINQ to SQL Compiled
-------------------------------------------------------------------
Strongly Typed DataSet Breakdown
175.11% slower than SQL Data Reader
216.26% faster than LINQ to SQL
112.17% slower than LINQ to SQL Compiled
-------------------------------------------------------------------
LINQ to SQL Compiled Breakdown
156.11% slower than SQL Data Reader
242.58% faster than LINQ to SQL
112.17% faster than Strongly Typed DataSet
比较起来,Data Reader还是最高效的,DataSet次之, LINQ to SQL Compiled还行,LINQ就不要用了。
再次证明了程序越干净越好。
跟着用户走到沟里(转载)
[ 大恐龙 发表于 2008年4月13日 01:05 ]
这篇文章让我感受到产品设计的重要性:
1、交互设计大师、“Macintosh”之父Jaf Raskin)曾说:好的设计不会让使用者养成对今后工作不利的习惯,但设计人员却经常有意无意地给用户设下坏习惯的陷阱。事实上,良好的设计应该在 给用户带来帮助的同时,把对其未来可能出现的限制性障碍降到最低, 保持使用者自由的可扩展性。
这说的是交互设计。放在产品上亦然。
2、很早的时候么么只要被抱到厕所把尿就大哭,在客厅就没事,但妈妈还是哄着去厕所把尿,现在么么已经习惯了在厕所尿尿。
事实上所谓“设计人员经常有意无意地给用户设下坏习惯的陷阱”,更多时候缘于“一味顺从用户表面需求和习惯”或者“把用户假设的太笨”……
3、当你设计一个IM,担心用户不知道按回车就可以发送,为了让用户很快的上手就在明显为止设计一个大“发送”按钮,搞的某些用户习惯性的去点“发送”而不采用效率更高的“回车”。最终永远都无法把“发送”按钮去掉,甚至无法弱化“发送”按钮。
Tags:
'
产品
'
"说说"的ChangeLog
[ 大恐龙 发表于 2008年3月24日 00:28 ]
0.1.2(2007-5-20) 主要针对滥用问题,也就是被修改js文件和swf破解的问题,还包括封装修改和反向工程,决定暂时停止新版的开发,修正和添加一系列策略和方法,将精力集中到安全和鲁棒性的修正上。
"说说"于2007-3-22正式上线运行,初始版本号定位0.1版
0.1.1(2007-3-23) 修改放黑客安全模块,容易产生误报,将一些写的及其糟糕的html当成注入,拒绝合成。修改一个可能被黑客利用的安全问题,修改带有半角"造成的问题。
0.1(2007-3-22) 功能原型实现,正式上线试运行。
还要再勤奋一点,或者应该不止一点
[ 大恐龙 发表于 2008年3月15日 22:46 ]
为了开发在线语音合成系统,连续干了3周,3周平均每天工作16小时,第一天通宵然后第二天白天接着干到晚上6点,睡觉,睡12小时,吃,疯狂的吃。然后再干,3周下来,总算写出了原型,还有几个IO的问题没有解决,人反而没有丝毫的疲惫,反而使满腔的斗志,感受:为什么自己以前想干一件事情总是没有干,真的是没有时间吗,要做的事情为什么老是做不完,或者说虎头蛇尾,真的是很累吗。完全决对以及彻底的不是,就是自己素质低,没文化又馋又懒。想起上学时看过的一本书。曾老先生写的《挺经》。
"天下事在局外呐喊议论,总是无益;必须躬自入局,挺膺负责,乃有成事之可冀!"
读时没有什么感觉,现在看到的确是真理,愤世嫉俗的牢骚是没有用的,慷慨激昂的答话是没有用的,八面玲珑的城府更是没有用的,必须躬自入局,以死相拼,乃足以活。没有时间可以不睡觉吗,很累忍一忍也就是了,必须挺,挺而再挺,挺后接挺,一直挺下去,才能成事。所以,我必须再勤奋一点,或者应该再多点,再勤奋很多才可以,才可以做成一点点事情,一点点,一点点.......
Tags:
'
勤奋一点
'
我的iCast,nTelevise已修复下载
[ 大恐龙 发表于 2007年6月17日 01:29 ]
JavaCC学习笔记 -- by greatdino
[ 大恐龙 发表于 2007年5月 3日 18:34 ]
JavaCC是一个java语言分析器,就是按照“模版”,“装配”不同的语言分析程序的源代码。复杂语言的语法通常都是使用 BNF(巴科斯-诺尔范式,Backus-Naur Form)表示法或者其“近亲”― EBNF(扩展的 BNF)描述的。自动化工具可以使用那些描述(我将使用通用的术语 BNF来指代这两种变体)或与它们近似的描述来为你生成解析代码。
这个例子可以在javacc-4.0/doc/examples/SimpleExamples/Simple1.jj看到
......
PARSER_BEGIN(Simple1)
public class Simple1 {
public static void main(String args[]) throws ParseException {
Simple1 parser = new Simple1(System.in);
parser.Input();
}
}
PARSER_END(Simple1) void Input() : {} {
MatchedBraces() ("\n"|"\r")*
}
void MatchedBraces() : {} {
"{" [ MatchedBraces() ] "}" }
......
设置好javacc的bin目录后,在命令提示符下输入
javacc Simple1.jj
然后javacc就会为你生成下面几个java源代码文件
Simple1.java
Simple1TokenManager.java
Simple1Constants.java
SimpleCharStream.java
Token.java
TokenMgrError.java
JavaCC的输入文档是一个词法和语法的规范文件,其中也包括一些动作的描述,它的后缀应该是jj。
简而言之,一个jj文档由下面几个部分构成:
1、Options{}部分:这个部分对产生的语法分析器的特性进行说明,例如向前看的token的个数(用来解除冲突)。这一部分是可以省略的,因为每一个选项都有默认值,当我们没有对某个选项进行说明时,它就采用默认值。也可以把这些选项作为javacc命令的参数来启动javacc,可以达到同样的效果。
2、分析器类的声明:这个部分指定了分析器类的名字,以及其他类中成员的声明。这个部分是必须有的。这个部分的声明如下:
PARSER_BEGIN(classname)
Class classname {
……
}
PARSER_END(classname)
3、词法部分声明:这里面有四类:SKIP、TOKEN、SPECIAL_TOKEN、MORE。其中,SKIP用来说明被忽略的串,下面是一个例子:
SKIP {
“ “
|
“\n”
|
“\r”
}
TOKEN用来说明在词法层次上识别的token,下面是一个例子:
TOKEN {
<ID: (“a”-“z”|”A”-“Z”)+>
|
<NUM: (“0”-“9”)+>
}
这个部分是可以省略的。
4、在词法声明部分,以#开头的token只是在词法分析时使用,不能作为语法分析的输入,也就是说,它相对词法分析是局部的。
5、语法声明和动作代码:这一部分生成的代码会直接插入分析器类声明的结束括号之前。一般而言,语法中的每一个非终结符都对应一个函数,其中函数的形式如下:
Return_type function_name()
{变量声明和一些初始化的动作}
{上下文无关文法的右部分,其中每个组成部分的形式如下:
语法部分 {动作部分}
两个部分都可以省略。语法部分可以是一个字符串(简单的token常常可以这样处理),TOKEN中声明的token,或一个对某个非终结符对应的函数的调用。
}
以上说明的是jj文件的组成部分,下面再说明一下jj文件中语法的表示方法。Javacc中的语法表示吸收了UNIX中正规文法的一些记号,下面是一些:
[]:其中的内容是可选的。
+:前面的内容出现一次或多次。
-:前后构成的闭区间。
*: 前面的内容出现0次或多次。
?:前面的内容出现0次或一次。
~:后面的内容的补。
|:前面或后面。
():改变运算的优先级,把其中的内容作为一个整体。













![[Valid RSS]](http://www.w3cool.com//images/valid-rss.png)
![Validate my Atom 1.0 feed [Valid Atom 1.0]](http://www.w3cool.com//images/valid-atom.png)






[xxm] 于 10-07-13 发表: 现在是不是免费版本不能用了。 总提示我进行了不正确的封装....
[keke302] 于 10-07-02 发表: 做的不错,支持一个,中国人还是很牛滴 ...
[大恐龙
[大恐龙
[buno] 于 10-03-29 发表: 楼主快回来,你的http://speech.w3cool.com/swf/speech.js死链了~...
[123] 于 10-01-08 发表: 你的服务器端是自己开发的吗? 如果是用mut tts的话,就放开源吧。...
[淮安人生] 于 09-12-11 发表: 太ND了,不知如何使用,先看看~...
[武涛] 于 09-11-18 发表: 郁闷了我要免费试用拉,在哪排队...
[大恐龙
[ym] 于 09-10-18 发表: hi.你这个播放器的内容是怎么实现的?可否详细撰文介绍一下?...
[大恐龙
[大恐龙
[zi] 于 09-09-23 发表: 功能很不错,就是有的只读到一半就不给读了,一次最多能读多少字呢...
[ll] 于 09-09-23 发表: 可惜了 我测试俄语 不能朗读如果要是能的话就太好了...