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