老赵点滴


  先做人,再做技术人员,最后做程序员。
  我的理想:“让外国人看中国人写的技术书籍和文章”。Try as I might
posts - 283, comments - 9920, trackbacks - 130, articles - 6
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

  记得数年前,当ASP.NET刚出现时,天下间Web开发框架中似乎出现了一个“巨人”,WebForms这种似乎人人都能掌握的开发框架几乎瞬间流行起来。如果谁还在用传统ASP这种控制与表现混合的开发方式,似乎立即变得低俗了许多。于是乎许许多多人都学会了拖控件+绑定的方式,“Web开发人员”也越来越多,一片红火,好不热闹。

  风水轮流转,不知从什么时候开始Rails框架随着RoR忽的流行了开来,.NET社区也出现了Monorail,批判WebForms声音也慢慢多了起来。如今微软自己也推出了基于ASP.NET平台的MVC框架,很多WebForms的反对者似乎更加自信了:连微软自己都抛弃了WebForms,证明WebForms的确该退出历史舞台了,也听到了一些类似于“WebForms不适合Web开发已经是公认的事实”这样“无比肯定”的话。先不说微软推出MVC到底是不是意味着它抛弃了WebForms,单从那些MVC追捧者们“念念不忘”的WebForms的缺点上来看,我认为他们大部分只是在“跟风”,就和当年许许多多人追捧WebForms一样。

  不过我必须承认,我对ASP.NET MVC的了解仅限于Scott Gu博客上所写的内容,至今还没有下载过ASP.NET 3.5 Extensions CTP。而对于RoR和Monorail也仅限于一些资料和示例,从来没有写过一行代码。按照我的“标准”,我自己是没有资格评论MVC框架的优劣的。不过我还是想写这篇文章,因为我只会WebForms平反,而不会“贬低”MVC框架;我只是想证明WebForms的那些缺点到底真的是缺点,还是开发人员自身没有好好利用起这把利器。因此我将会根据我的经验,一一回应对WebForms比较常见的指责。如果措辞上有任何的不妥,也请大家多多包涵。

  我下面提到的做法,都是在经过实际开发过程检验的(例如开发人员与美工的合作),可能不是最佳,但是我认为还是不错的。

一、ViewState

  HTTP是无连接无状态的协议,因此ASP.NET中提出了ViewState的概念,这样数据被重新Post回页面时,页面(控件)的状态就能恢复,因此才有了很多丰富的功能,例如一些复杂的控件事件。但是ViewState带来的问题就是,如果使用不当,那么页面体积就会增加许多,网络中传输的数据太多自然会影响性能。

  但是ViewState真是必须的吗?我可以很负责任地说,在如今大部分Web应用的页面中,出现的几乎都是大量的链接,点击链接就会跳转到一个和当前页面完全无关的新页面,这样的话,页面上的ViewState又有什么用?因此我如果新建一个Web项目,做的第一件事情就是去Web.config中将enableViewState从全局关闭——同时关闭的还有enableSessionState,这也是影响性能的因素之一(stateless也便于做Web服务器层面的负载均衡)。

  有人曾经反驳我,关闭了ViewState,用WebForm还有什么意义?我的答案是:意义多的很。WebForm提供了控件模型,我能够使用“人人都能看懂和编写”的方式来设置或读取一个文本框里的值。我能轻松地响应不同按钮的事件来编写触发各种业务逻辑。这就是意义,WebForms的开发还是非常简单而清晰的(在一定程度上吧,不要“滥用”永远是正确的)。

  嗯?刚才不是说只有保持ViewState才能使用控件的事件吗?没有ViewState怎么从控件中重新获取状态呢?请注意我之前所说的是“复杂事件”。什么是复杂事件?TextBox的TextChange事件就是“复杂事件”,GridView的Command事件也是复杂事件,但是Button的Click事件就是“简单事件”;与此相对的,GridView里的每一行的数据每一个子控件的状态是“复杂状态”,而TextBox的Text属性则是“简单状态”。“复杂状态”和“复杂事件”需要ViewState,因为与之有关的这些“控件”是ASP.NET“无中生有”的,但是“简单事件”和“简单状态”基于页面中“必然”会提交的数据,它们自然能够还能够使用。在我的ASP.NET开发过程中,使用的几乎都是“简单事件”和“简单状态”,而印象中放弃“复杂事件”和“复杂状态”并没有给我带来任何的困扰。

  当某人送给我们10件礼物,而其中只有4件是我需要的,那么为什么不能简单地放弃其余6件,偏偏要去感谢只送给我们3件礼物的人而去指责前者呢?要知道他并没有恶意,那多余的6件也没有给我们造成任何困扰。

  但人就是那么奇怪。

二、性能

  WebForms的一个重要特点就是一个强大(很多情况下也是“复杂”的代名词)的组件模型。这个组件模型包含一个叫做“生命周期”的玩意儿,也就是这个玩意儿被不少人指责为性能杀手。这个复杂的生命周期的确在很多时候只是“无谓”地一遍遍执行,似乎的确造成了“浪费”,但是这真的到了“杀手”级别了吗?

  如果您认为这个组件模型为性能杀手,不如编写一个内置1000个动态Button控件的页面,然后部署到服务器上,我保证运行的飞快。1000个不够的话那么可以试试看3000、5000甚至10000个控件。您哪张页面上控件的数量会比这个还多?但是您多少页面的性能会比它高?也有文章说“尽可能少的使用服务器端控件,最多使用HTML控件加上runat=server”,这更加没有理由了:一个加了runat=server的HTML控件,它已经变成了服务器端控件了。而普通的HTML最后在控件树中仅仅被作为普通的文本而处理,在控件树中是用一个Literal保存其中的“字符”。至于具体内容是什么,ASP.NET根本不会关心。

  造成性能问题的原因多种多样,在对性能问题进行探索和优化之前,一定要找准性能瓶颈是什么,才能对症下药。如果从某些层面上讲,将公共部分提取成新的方法,会造成执行上多一次call指令的执行,性能也就“降低”了,但是我相信没有人会因此将同样的代码到处复制。在我们接触到的Web应用中,性能瓶颈大都是在数据库访问上(或者外部Service访问,等等),多执行一次数据库查询操作可能就能抵得上内存中1亿次引用拷贝。我相信,如果一个ASP.NET应用程序的性能不高,几乎不可能是因为组件模型或生命周期造成的问题。

  既然Web应用瓶颈大都在数据库访问上,那么一般该如何解决这个问题呢?最直接的方式应该是优化数据库的查询,但是最关键的可能还是缓存。君不见每个谈到Web应用性能优化的讲座都将Cache放在数一数二的位置上,因为这的确是最有效的优化方式之一。在一个并发较高的Web应用中,对一些数据进行1分钟的缓存也能带来相当可观的性能提高。其他的方式可能还有生成静态页面(没有比这访问速度更快的了),异步调用(例如一篇刚发布的文章,在数分钟后才能被搜索到也没有关系,那么何必一定要同步地、即时地写入数据或者创建索引呢?)、分离不同作用的服务器(可以为不同服务器进行有针对性的配置,例如分离图片服务器),做Web服务器端的负载均衡(stateless的重要性由此可见),对数据库进行纵向切割(加快内存中载入的数据量可以提高查询性能,并且纵向切割后能够使用多台数据库服务器分担压力),横向切割(sharding,将数据分置在不同的数据库中,以此可以通过scale out来扩展减少每台服务器的负载,提高性能),作数据冗余或Master-Slave(稍稍降低写操作的性能而提高读取数据的性能,普通Web应用大都“读取”远多于“写入”)等等。

  当然我上面提到的都是应用程序实现和架构方面的东西,事实上开发一个高性能Web应用还涉及到硬件/软件/操作系统等多方面,这里就不多解释了(其实这方面我也还在探索过程中)。其实我在这里想说的仍然是,开发高性能Web应用程序的关键大都与具体所用的实现技术无关:只要“实现”正确,做法大都相同,无论Sql Server/Oracle,Windows/Linux还是ASP.NET/RoR,其本质都差不多。Ruby和C#的性能相差十倍(存疑,求证),不还是能够开发出高性能的Web应用吗?

 

相关文章:

为WebForms说几句话,以及一些ASP.NET开发上的经验(2):生成丑陋的HTML,难以进行样式控制

为WebForms说几句话,以及一些ASP.NET开发上的经验(3):生成复杂的ID难以使用JavaScript操作

未完待续:

五、MVC

六、单元测试

Feedback

#1楼    回复  引用  查看    

2007-12-22 02:48 by aspxphpjsprb      
好文章,顶,抓住影响性能的瓶颈才是硬道理。

#2楼    回复  引用  查看    

2007-12-22 02:49 by Koy      
以前认为不可能的事,现在给我碰上了:根据需求,我现在要做一个单个页面有500个左右TextBox,正如你所说性能也不太差,呵呵!

#3楼    回复  引用  查看    

2007-12-22 03:09 by Henry Liang      
同意老赵的意见。的确,webform在很大程度上,是对于http行为的一种封装,同时加上了很多附加价值,例如viewstate对于状态管理,控件模式对于开发效率的提高和开发门槛的降低。不能不说微软在这方面做得的确不错。
但与此同时,也使得很多只懂得拖拖控件的初学者也可以“大胆”地开发项目了——却忽略了webform背后封装的内容,如此的“开发”,如何能够避免问题的产生呢?明明是人的问题,却赖到webform控件上,明明是人不懂得使用工具,却赖到工具头上,加上一些所谓的“专家”煽风点火,一些所谓的“程序员”愤青般地跟风,才造成了现在的舆论。这样的舆论的背后,事实上也隐藏着一个论断,“程序效率不高不是我开发人员的错,是webform的错,是微软的错……”。完完全全就是推卸责任的言辞。事实上,有多少程序的bug是编译器的错而多少是程序员的错?有多少服务器被攻破是防火墙的错而多少是网管的错?……
扯远了,最后强烈支持老赵顶住舆论的压力说出真话。独立思考,实事求是,敢说真话,才是最有价值的东西。

#4楼 [楼主]   回复  引用  查看    

2007-12-22 03:21 by Jeffrey Zhao      
@Henry Liang
客气了,这些其实是我的经验。WebForms如果按照微软“演示”的方式来做,的确会有问题。但是WebForms本身是很好的,合理使用,不会对开发造成影响,而且我们不会有什么损失。

#5楼    回复  引用  查看    

2007-12-22 04:06 by 武眉博<活靶子.Net>      
说的不错。

#6楼    回复  引用  查看    

2007-12-22 05:38 by 怪怪      
嘿嘿, 老赵怒了, 这次我省劲儿了 :P

#7楼    回复  引用  查看    

2007-12-22 06:58 by Henry Liang      
@Jeffrey Zhao
我也要谢谢你,谢谢你说出了我一直想说而没有说出的话。一直以来,我就看过不少职责webform的文章,加上一些跟风的言论,既让人郁闷又让人担心——担心这种言论会误导其他开发人员,甚至误导客户。
加上我也是从一个“只会拖控件”的程序员成长起来的,也做过viewstate有半个megabyte的网页,所以我能够了解这种成长的痛苦,也深深为不负责任的言论感到痛心。
最后再次感谢。

#8楼    回复  引用  查看    

2007-12-22 08:01 by 大石头      
非常同意Jeffrey Zhao 和Henry Liang 的说法。
我非常鄙视那些根本不懂webform原理,自己用错搞砸了,而只会把责任推到工具上的人。而这些人还自以为是的到处鼓吹,更是影响了另一批不熟悉webform原理的人,而最后大大影响了客户,实在是令人心寒哪。

今年忙碌了一年,也是因为老板被类似的这种人给忽悠了,痛苦呀。

◎Henry Liang
0.5M的viewstate不多,你不知道,我们公司的大多数网页都超过这个数。总是到了最后,运行出问题了,才找我去搞性能优化。
好好的grid不用,偏要自己实现一个,搞得一个页面写了一千五百多个字符串连接,才两万行数据,就把一台四处理器的服务器给搞垮了……

#9楼    回复  引用  查看    

2007-12-22 08:21 by Jeffery Huang      
将enableSessionState关闭是没有问题,如果关闭ViewState的话,一些使用了ViewState的自定义服务器控件怎么办呢?另外还想请教一点,如何用简单事件和简单状态达到复杂事件和复杂状态的效果呢?谢谢

#10楼    回复  引用  查看    

2007-12-22 08:27 by 哥哥.Net      
大清早起来就看到这样的好文章,一天心情都会很好。3Q~。

现在各种技术层出不穷,作为一个技术人员,最重要的并不是成天叨咕这个好那个不好,更别说同为.net语言的web开发中说这个行那个不行,真是太没有意义,说webforms不好,mvc好,但他们的本质是什么呢?还不是.net下的bs开发,区别真的那么大吗?感觉那些程序员有点象喜欢捣闲话的女人,三八。


另外补充一下,看了上面的几篇回复,怎么回复时间都是半夜?各位要多多注意休息啊,身体搞坏就不好过圣诞了。

#11楼    回复  引用  查看    

2007-12-22 08:31 by 随风流月      
写的不错。赞一个。

#12楼    回复  引用  查看    

2007-12-22 08:34 by 阿不      
我同意,性能低下并不是WebForm的标签。性能低下一般都是由于数据库方面的瓶颈所造成的,有的人在指责性能低下是由于页面的全命周期过长引起的。总的来说它就是一个处理ProcessRequest的过程,周期的长短是由你程序代码的执行时间来决定的。
ViewState目前我们也都不用,但不会影响到正常的开发和功能实现上。
另外,一些缺点是有,但是很大程度上是被过度放大了。

#13楼    回复  引用  查看    

2007-12-22 08:37 by JerryChou      
呵呵,实践才是检验真理的唯一标准,我所有开发过的项目都是基于webform的,还都用了orm,这两个东西都是那些所谓“高手”认为性能低下的东西,事实上呢,这些项目都运行的非常良好,其中不乏大数据量,高并发的项目,没听到过客户或用户有“速度慢”的抱怨。

#14楼    回复  引用  查看    

2007-12-22 08:49 by Share赖      
不管 B/S 或者 C/S ,第一次创建数据库连接总会卡住几秒。请问怎样该如何解决?谢谢

#15楼    回复  引用  查看    

2007-12-22 08:51 by 淘者天下2      
挺赞成您的观点的。

#16楼    回复  引用  查看    

2007-12-22 08:59 by 韩现龙      
嗯。facebook也是asp.net webforms开发的,不一样性能刚刚地?

#17楼    回复  引用  查看    

2007-12-22 09:00 by 留恋星空      
小弟做开发也没多久,经验有限所以常常苦恼程序究竟怎么写才能做的更好,性能更优,希望楼主多写一些这样的文章。

#18楼    回复  引用  查看    

2007-12-22 09:28 by lovecherry      
good,cnblogs多一点这样的文章就好了。跟风的文章太多了,使得大家似乎都不知不觉爱上了MVC/WCF/LINQ。。

#19楼    回复  引用  查看    

2007-12-22 09:35 by Young.J      
@韩现龙
facebook是webforms的吗?我了解facebook大量使用的是开源的东东,页面好像是php+mysql的!

#20楼    回复  引用  查看    

2007-12-22 09:41 by 在线翻译 [未注册用户]

不错

#21楼    回复  引用  查看    

2007-12-22 09:42 by henry      
刚想起这样一个讨论,结果楼主就上了.
同意楼主的说法任何一样东西都有利有弊,不善用不等这样东西就失去价值.
拿什么才适合企业级应用就更可笑...

#22楼    回复  引用  查看    

2007-12-22 09:48 by je [未注册用户]
facebook?

他大概是想说MySpace,不是facebook

#23楼    回复  引用  查看    

2007-12-22 09:49 by 超晨      
webform就是,会用不难,用好不容易,同问◎Jeffery Huang提的问题

#24楼    回复  引用  查看    

2007-12-22 09:49 by 啊东      
无论是MVC还是WebForms都只是实现开发的一种方式,无所谓孰轻孰重,只要能完成好开发,用那种我倒无谓;期待老赵的开发经验..........

#25楼    回复  引用  查看    

2007-12-22 09:51 by 重典      
用之不当,为祸一方....赞同...

但"加了runat=server的HTML控件"应该的确是比.net2.0中的WebControl要快些的,因为HtmlControl没有WebControl那么多的功能和事件,所以应该是可以快些,但很多功能就完不成了

#26楼    回复  引用  查看    

2007-12-22 09:54 by 重典      
附:这年月Asp的大站还是有的....维护的也不错....再附:大站暂时指Alexa10W-的吧

#27楼    回复  引用  查看    

2007-12-22 09:59 by airwolf2026      
是呀,对于我这个大学里面接触了一些ASP,现在才开始做ASP.NET的人来说确实是好文章啊。大大的赞一个哈。期待楼主的下文。

#28楼    回复  引用  查看    

2007-12-22 10:00 by jackwang [未注册用户]
写的很好,但是问题是mvc是不是强制我们能避免一些性能损失呢?就好比不想让学生在校外犯错,最好的方法应该是不让他出校门,当然教育的好的学生,出了校门不但不犯错,还能学习很多有益的事情,但是有几个学生能做得到呢? 还是那句话,学习成本。就像c++ 效率高,但是学习成本也高。
我觉得重要的是人,但是更重要的是让普通人都能很快学会。

就像NBear一样,之前一直学不会,当我学会使用后,发现真的很好用

希望老赵能举些实例来论证其观点,也能让我们这些小菜学习学习。

顺便问一下,我有一个从webservice 返回大量结果的数组,里面是复杂对象,我绑定到gridview上,我想做分页,但是每次调用webservice返回的结果都是不同的,那么当用户访问第二页后,在访问第一页,要想保持第一页数据不变,我除了把数据放到viewstate或者session里,还有别的办法吗?我觉得这两种方法都会有很大的性能损失,希望老赵能给点好的思路,客户不同意修改webservice返回的结果就是随机,因为他有100000条数据,但是每次随机返回1000条,我要对这一千条数据再分页。

#29楼    回复  引用  查看    

2007-12-22 10:19 by watson hua      
就事论事,如果对性能有要求,瓶颈在页面生成上就优化页面,如果瓶颈在数据访问上,就优化数据访问。
大家为什么跟风,是因为大部分程序员在不了解机制的情况下,又受到一些权威的又有煽动性的声音的影响。
再说webform,webform的本质就决定优化到一定程度的时候必须放弃他。
quote["当某人送给我们10件礼物,而其中只有4件是我需要的,那么为什么不能简单地放弃其余6件,偏偏要去感谢只送给我们3件礼物的人而去指责前者呢?要知道他并没有恶意,那多余的6件也没有给我们造成任何困扰。"]
事实上"那多余的6件"给大部分人造成极大困扰。不讳言的说,asp.net程序员在所有web开发人员中,对web标准了解程度是最低的,因为asp.net对web标准了解的要求是最低的。什么是困扰,这就是困扰。
至于"生成HTML不规则,难以进行样式控制",我倒认为站不住脚,其实生成机制是很规则的,不存在随机性。asp.net内置控件就那么多个,花两个小时看一下,也就一劳永逸了。
再说"生成的ID难以使用JavaScript操作"(这个ID建议用小写id),这就更无稽了,仅仅是你不能直接指定它的id而已,有id就可以了,叫什么重要么?
倒是有几个真正的asp.net局限让人非常不爽,比如服务器属性解释的优先级比<%=%>要高,让人绕了弯子去用#$。比如asp.net生成的js(所谓的回调)和程序员编写的js干扰。暂时不能一一例举。

#30楼    回复  引用  查看    

2007-12-22 10:34 by 韩现龙      
--引用--------------------------------------------------
Young.J: @韩现龙
facebook是webforms的吗?我了解facebook大量使用的是开源的东东,页面好像是php+mysql的!
--------------------------------------------------------
你击右键,看看源码。
以前我也以为是php的,因为其扩展名是php,谁知那天出现的一个错误让我吓了一跳,竟然是咱们最熟悉的红黄页!!
这是我那天的截图:
http://www.facebook.com/photo.php?pid=228032&id=840113937

ps:也可以是部分php,部分aspx吧

#31楼    回复  引用  查看    

2007-12-22 10:34 by assembly      
@jackwang
还有Cache 可以使用

#32楼    回复  引用  查看    

2007-12-22 10:47 by JerryChou      
@watson hua
不知你所云

#33楼    回复  引用  查看    

2007-12-22 10:47 by jjx      
@韩现龙
facebook提供api,可以用多种语言,python,ruby,java.c#等等扩展,所以你看到一个用C#扩展的应用也不足为奇. 问题是,你访问的应用是否是facebook的核心应用还是第三方扩展的

现在ms有了facebook的股份,估计facebook中也会侧重一些ms的技术



#34楼    回复  引用  查看    

2007-12-22 10:48 by 陈超群      
看了批判WEBFORM的,觉得WEBFORM不好,看了老赵这文章,又觉得没什么不好,搞郁闷了,希望微软自己能站出来说说话!

#35楼    回复  引用  查看    

2007-12-22 10:58 by 重典      
@韩现龙
那个是用FaceBook的.netApi自己开发的东西出错了吧

#36楼    回复  引用  查看    

2007-12-22 11:03 by t-mac.NET      
@陈超群
小马过河的故事知道吧

#37楼    回复  引用  查看    

2007-12-22 11:19 by FantasySoft      
WebForm让更多Desktop的开发人员可以更轻松地跨入Web开发的领域,这一点的作用可谓功德无量了。事实上,在那个Web开发还是阳春白雪的年代,降低开发门槛是首当其冲的任务,WebForm的方向对了,而且做得非常棒!

但是,任何事物都有两面性,WebForm也是如此。WebForm模糊了桌面开发和Web开发的界限就像一把双刃剑,让很多开发人员没有弄清楚HTTP是一个无状态的连接协议,我们付出的那么多劳动都是为了能够更好、更方便地保存状态。WebForm帮助我们保存了状态,让我们变得懒惰,让我们无法去了解Web应用程序的真正模型。随着开发的深入,这一点很容易成为开发人员的软肋。

两年多以前,我写过一篇东东——.NET和系J2EE该相互学习些什么,里面有提到有关WebForm的思考。感兴趣的朋友可以看看,拍拍板砖什么的,谢谢。

#38楼    回复  引用  查看    

2007-12-22 11:43 by Klesh Wong      
@陈超群
没有绝对的好与不好吧,搞清楚两者的区别,优缺点,该用哪个的时候就用哪个。
写的不错,我都使用过webforms和monorails。技术都是自己根据需要来选择的。Web from和asp.net mvc将来是asp.net 两兄弟,共同成长。 MonoRail作为ROR在.net上的实现,可以让开发人员继续发挥.net的强大框架。Monorail在将来就可以归到asp.net mvc下面,webfrom和asp.net共同促进,何不快哉。
关键是对webfrom的机理的掌握,现在很多的同行们只会拖控件,不知道为什么只可以拖拖控件就可以。非常的期望我们同行们自其所以然。
很多人只知道表面东西,这也是.net开发人员同其他的开发人们一个很大的不足。

#40楼    回复  引用  查看    

2007-12-22 12:30 by 北极狐      
刚刚开始编写程序的时候,就感觉Web是一个垃圾堆,很差的代码风格,特别慢的响应速度,到处报错的脚本,在操作系统级别上轻易可以实现的功能在Web 上实现的就是牛人

#41楼    回复  引用  查看    

2007-12-22 13:02 by lankey      
不错!

#42楼    回复  引用  查看    

2007-12-22 13:15 by Dove.Net      
学到了,WEBFORM和MVC共存应该是不会有冲突的

#43楼    回复  引用  查看    

2007-12-22 13:49 by 水果阿生      
好文章,关注

#44楼    回复  引用  查看    

2007-12-22 13:55 by 蛙蛙池塘      
赵兄说的有理,我是昨天才开始了解monorails,感觉用它那套思路只是觉得更清爽,更底层一些,性能上我也觉得不是关键,主要是设计界面的时候可以先设计模板,然后写好数据绑定到模板上。
做一个站点不可能上来就做到最好的性能,怎么快先怎么做出来,一期设计也许就支撑1000人,这时候你的站点没准还没有那么大的流量呢,二期访问的人多了,再找到瓶颈,去解决瓶颈,三期,四期也是去找瓶颈去,我估计那网站得更新到10期往后才能找到webfrom内部机制的瓶颈吧。

记得你CSS也很强,有时间帮忙看两个CSS布局的问题吧,谢谢。
http://space.cnblogs.com/question/354/
http://space.cnblogs.com/question/353/

#45楼    回复  引用  查看    

2007-12-22 14:01 by 曲滨*銘龘鶽      
赵兄这话说的中听

其实个人认为说 WebFrom 不好的人都是对 http dom html js css 以及web一系列综合性技术不太了解的人。

这个世界上基本没有什么技术是不好的、只有什么更适合而已。

#46楼    回复  引用  查看    

2007-12-22 14:36 by kuafoo      
php 也可以跑在.net下 而且性能比zend核心下还高

#47楼 [楼主]   回复  引用  查看    

2007-12-22 14:57 by Jeffrey Zhao      
回应http://www.cnblogs.com/szw/archive/2007/12/22/1010449.html

我不是说WebForms在执行上不会较MVC慢,我的意识是这种一定程度上的“慢”不会造成性能瓶颈,所以根本可以忽略。比如你说的1000个按钮和GridView,难道一个应用只有服务器端这部分处理,而没有数据库访问,外部服务访问吗?
再说PostBack,从你举的POS机的例子来看,还是一定要用PostBack,而且说“普通的Web Form 模式,会产生较多的数据量”,但是我在文章中也说了,我们完全可以不用PostBack,我们什么都没有损失。指令式的请求,MVC可以做到,WebForms也可以做到。(我虽然没有写过,但是我了解过RoR和MonoRails的开发方式和实现方式,所以这些特点还是知道的,呵呵。不了解的可能只是对于真实项目里的开发体验,比如开发效率)
不要把PostBack和WebForms绑定起来,这完全可以分开考虑。
也就是说,如果只限于你这片文章里说的内容:
1、MVC能做到的,WebForms也能做到(可能有点绕,要配合URL Rewrite和一些自己写的组件等等,呵呵)。
2、WebForms的缺点,我完全可以避开,而且没有任何损失。

#48楼 [楼主]   回复  引用  查看    

2007-12-22 15:17 by Jeffrey Zhao      
@怪怪
还是你说出来看着爽快,呵呵。

#49楼 [楼主]   回复  引用  查看    

2007-12-22 15:19 by Jeffrey Zhao      
@Henry Liang
微软的责任可能是:“带坏了一批程序员”。但是程序员不了解标准,HTTP、Web开发的本质等问题,我想至少有一半责任也该是程序员自己的吧。

#50楼    回复  引用  查看    

2007-12-22 15:20 by jt [未注册用户]
bz的意思是不是这样:

绑定一个gridview,rendering, 然后客户端点击delete,服务器端响应事件,执行delete 的sql,然后再绑定,rendering

这样就不用viewstate了

不知我理解的对不对

#51楼 [楼主]   回复  引用  查看    

2007-12-22 15:25 by Jeffrey Zhao      
@大石头
--引用--------------------------------------------------
大石头: 非常同意Jeffrey Zhao 和Henry Liang 的说法。
我非常鄙视那些根本不懂webform原理,自己用错搞砸了,而只会把责任推到工具上的人。而这些人还自以为是的到处鼓吹,更是影响了另一批不熟悉webform原理的人,而最后大大影响了客户,实在是令人心寒哪。

今年忙碌了一年,也是因为老板被类似的这种人给忽悠了,痛苦呀。

◎Henry Liang
0.5M的viewstate不多,你不知道,我们公司的大多数网页都超过这个数。总是到了最后,运行出问题了,才找我去搞性能优化。
好好的grid不用,偏要自己实现一个,搞得一个页面写了一千五百多个字符串连接,才两万行数据,就把一台四处理器的服务器给搞垮了……
--------------------------------------------------------
我觉得在ASP.NET需要拼接字符串的地方其实不多,一些数据绑定控件是非常好用的——当然不是指GridView这些,呵呵。

#52楼 [楼主]   回复  引用  查看    

2007-12-22 15:28 by Jeffrey Zhao      
--引用--------------------------------------------------
Jeffery Huang: 将enableSessionState关闭是没有问题,如果关闭ViewState的话,一些使用了ViewState的自定义服务器控件怎么办呢?另外还想请教一点,如何用简单事件和简单状态达到复杂事件和复杂状态的效果呢?谢谢
--------------------------------------------------------
其实这个是具体情况具体分析了,如果可以的话,您可以提出您需要的应用场景,呵呵。

#53楼    回复  引用  查看    

2007-12-22 15:29 by jt [未注册用户]
如果您认为这个组件模型为性能杀手,不如编写一个内置1000个动态Button控件的页面,然后部署到服务器上,我保证运行的飞快。1000个不够的话那么可以试试看3000、5000甚至10000个控件。您哪张页面上控件的数量会比这个还多?但是您多少页面的性能会比它高?

我觉得如果一个静态页面包含1000个button不会慢于webform吧,毕竟只是html流的传输,不过听说微软建议把所有页面变成aspx,说是性能会提高,由是怎么回事呢?

#54楼 [楼主]   回复  引用  查看    

2007-12-22 15:30 by Jeffrey Zhao      
--引用--------------------------------------------------
Share赖: 不管 B/S 或者 C/S ,第一次创建数据库连接总会卡住几秒。请问怎样该如何解决?谢谢
--------------------------------------------------------
第一次慢一点是正常的,以后就好了。

#55楼 [楼主]   回复  引用  查看    

2007-12-22 15:30 by Jeffrey Zhao      
--引用--------------------------------------------------
jt: 如果您认为这个组件模型为性能杀手,不如编写一个内置1000个动态Button控件的页面,然后部署到服务器上,我保证运行的飞快。1000个不够的话那么可以试试看3000、5000甚至10000个控件。您哪张页面上控件的数量会比这个还多?但是您多少页面的性能会比它高?

我觉得如果一个静态页面包含1000个button不会慢于webform吧,毕竟只是html流的传输,不过听说微软建议把所有页面变成aspx,说是性能会提高,由是怎么回事呢?
--------------------------------------------------------
“微软建议把所有页面变成aspx,说是性能会提高”我没有听懂是什么意思……如果只是指扩展名的话……实在没有道理,呵呵。

#56楼 [楼主]   回复  引用  查看    

2007-12-22 15:32 by Jeffrey Zhao      
--引用--------------------------------------------------
je: facebook?

他大概是想说MySpace,不是facebook
--------------------------------------------------------
嗯,MySpace是在微软平台上实现高性能应用的典型例子,至此“微软技术不适合高性能应用开发”的论调不攻自破了,呵呵。

#57楼    回复  引用  查看    

2007-12-22 15:34 by jt [未注册用户]
--引用--------------------------------------------------
Jeffrey Zhao: @Henry Liang
微软的责任可能是:“带坏了一批程序员”。但是程序员不了解标准,HTTP、Web开发的本质等问题,我想至少有一半责任也该是程序员自己的吧。
--------------------------------------------------------

我有个搞java的朋友,他说:"微软把程序员当孩子养",说的不无道理,人家说穷人家的孩子早当家,我们这些大富大贵的纨绔子弟想成熟也要多长大几年啊:)

#58楼 [楼主]   回复  引用  查看    

2007-12-22 15:34 by Jeffrey Zhao      
@重典
--引用--------------------------------------------------
阿不: 我同意,性能低下并不是WebForm的标签。性能低下一般都是由于数据库方面的瓶颈所造成的,有的人在指责性能低下是由于页面的全命周期过长引起的。总的来说它就是一个处理ProcessRequest的过程,周期的长短是由你程序代码的执行时间来决定的。
ViewState目前我们也都不用,但不会影响到正常的开发和功能实现上。
另外,一些缺点是有,但是很大程度上是被过度放大了。
--------------------------------------------------------
媒体扩大效应,呵呵。

#59楼 [楼主]   回复  引用  查看    

2007-12-22 15:35 by Jeffrey Zhao      
--引用--------------------------------------------------
JerryChou: 呵呵,实践才是检验真理的唯一标准,我所有开发过的项目都是基于webform的,还都用了orm,这两个东西都是那些所谓“高手”认为性能低下的东西,事实上呢,这些项目都运行的非常良好,其中不乏大数据量,高并发的项目,没听到过客户或用户有“速度慢”的抱怨。
--------------------------------------------------------
说ORM慢可能一个重要部分是在指责“反射”比较慢——但是道理还是一样的,和查询比起来,反射不太会成为性能瓶颈,不过这方面的优化还是比较有手段的,呵呵。

#60楼    回复  引用  查看    

2007-12-22 15:36 by jt [未注册用户]
@Jeffrey Zhao
这是微软的建议做法,即使你做一个纯的html,你也把它写成aspx的方式,这样可能是编译的时候有优化把,不知道,不过的确有这么一说:)

#61楼 [楼主]   回复  引用  查看    

2007-12-22 15:36 by Jeffrey Zhao      
--引用--------------------------------------------------
陈超群: 看了批判WEBFORM的,觉得WEBFORM不好,看了老赵这文章,又觉得没什么不好,搞郁闷了,希望微软自己能站出来说说话!
--------------------------------------------------------
微软肯定会说的,只是我觉得还是要自己说给自己听最重要,呵呵。

#62楼    回复  引用  查看    

2007-12-22 15:37 by jt [未注册用户]
--引用--------------------------------------------------
Jeffrey Zhao: --引用--------------------------------------------------
JerryChou: 呵呵,实践才是检验真理的唯一标准,我所有开发过的项目都是基于webform的,还都用了orm,这两个东西都是那些所谓“高手”认为性能低下的东西,事实上呢,这些项目都运行的非常良好,其中不乏大数据量,高并发的项目,没听到过客户或用户有“速度慢”的抱怨。
--------------------------------------------------------
说ORM慢可能一个重要部分是在指责“反射”比较慢——但是道理还是一样的,和查询比起来,反射不太会成为性能瓶颈,不过这方面的优化还是比较有手段的,呵呵。
--------------------------------------------------------

hibernate中反射也导致速度慢,不过他们寄希望于缓存

#63楼 [楼主]   回复  引用  查看    

2007-12-22 15:38 by Jeffrey Zhao      
--引用--------------------------------------------------
jt: @Jeffrey Zhao
这是微软的建议做法,即使你做一个纯的html,你也把它写成aspx的方式,这样可能是编译的时候有优化把,不知道,不过的确有这么一说:)
--------------------------------------------------------
估计有上下文吧,纯HTML静态页面的话肯定是最快的,因为Web服务器里根本不需要做太多处理,甚至于把HTML直接当作数据流输出即可,如果缓存在内存中的话连磁盘IO都省了……

#64楼 [楼主]   回复  引用  查看    

2007-12-22 15:40 by Jeffrey Zhao      
--引用--------------------------------------------------
watson hua: 就事论事,如果对性能有要求,瓶颈在页面生成上就优化页面,如果瓶颈在数据访问上,就优化数据访问。
大家为什么跟风,是因为大部分程序员在不了解机制的情况下,又受到一些权威的又有煽动性的声音的影响。
再说webform,webform的本质就决定优化到一定程度的时候必须放弃他。
quote["当某人送给我们10件礼物,而其中只有4件是我需要的,那么为什么不能简单地放弃其余6件,偏偏要去感谢只送给我们3件礼物的人而去指责前者呢?要知道他并没有恶意,那多余的6件也没有给我们造成任何困扰。"]
事实上"那多余的6件"给大部分人造成极大困扰。不讳言的说,asp.net程序员在所有web开发人员中,对web标准了解程度是最低的,因为asp.net对web标准了解的要求是最低的。什么是困扰,这就是困扰。
至于"生成HTML不规则,难以进行样式控制",我倒认为站不住脚,其实生成机制是很规则的,不存在随机性。asp.net内置控件就那么多个,花两个小时看一下,也就一劳永逸了。
再说"生成的ID难以使用JavaScript操作"(这个ID建议用小写id),这就更无稽了,仅仅是你不能直接指定它的id而已,有id就可以了,叫什么重要么?
倒是有几个真正的asp.net局限让人非常不爽,比如服务器属性解释的优先级比<%=%>要高,让人绕了弯子去用#$。比如asp.net生成的js(所谓的回调)和程序员编写的js干扰。暂时不能一一例举。
--------------------------------------------------------
请教,优化到什么程度时必须放弃它?还有就是我想知道,如果优化到了那种程度是否还值得,如果投入2倍成本才获得10%的增长……

#65楼 [楼主]   回复  引用  查看    

2007-12-22 15:41 by Jeffrey Zhao      
--引用--------------------------------------------------
自由、创新、研究、探索……: 写的不错,我都使用过webforms和monorails。技术都是自己根据需要来选择的。Web from和asp.net mvc将来是asp.net 两兄弟,共同成长。 MonoRail作为ROR在.net上的实现,可以让开发人员继续发挥.net的强大框架。Monorail在将来就可以归到asp.net mvc下面,webfrom和asp.net共同促进,何不快哉。
关键是对webfrom的机理的掌握,现在很多的同行们只会拖控件,不知道为什么只可以拖拖控件就可以。非常的期望我们同行们自其所以然。
很多人只知道表面东西,这也是.net开发人员同其他的开发人们一个很大的不足。
--------------------------------------------------------
说句题外话嗯嗯……如果年龄比较接近,两兄弟一般总是从小打到大的,嘿嘿……

#66楼    回复  引用  查看    

2007-12-22 15:43 by Jeffery Huang      
--引用--------------------------------------------------
Jeffrey Zhao: --引用--------------------------------------------------
Jeffery Huang: 将enableSessionState关闭是没有问题,如果关闭ViewState的话,一些使用了ViewState的自定义服务器控件怎么办呢?另外还想请教一点,如何用简单事件和简单状态达到复杂事件和复杂状态的效果呢?谢谢
--------------------------------------------------------
其实这个是具体情况具体分析了,如果可以的话,您可以提出您需要的应用场景,呵呵。
--------------------------------------------------------

老赵你好
比如,假设写了一个简单的DropDownList,可以自动添加一个空选项,并且空选项的显示文本NullToDisplay可以任意设置
<cc1:CustomDropDownList runat="server" NullToDisplay=“Nothing” />
如果NullToDisplay不用ViewState而用私有成员变量保存的话,即使我在客户代码中修改了NullToDisplay的值,在呈现时,NullToDisplay还是显示在页面设置的这个初始值Nothing

#67楼    回复  引用  查看    

2007-12-22 15:47 by jt [未注册用户]
@Jeffrey Zhao
50楼的问题能不能回答一下,回复太多你可能没看到,这个贴挺火的:)

另外bz的意思是不是尽量利用控件的优势,同时避免viewstate等等的劣势
struts中也有所谓自定义tag,我看和.net的服务器控件也差不多把,在view这层上如何展现数据我看大家都没有特别好的方式