C#会重蹈覆辙吗?系列之1:论C#性能不能承受之慢

针对firelong在前贴《C与C++社区混战,C#会重蹈覆辙吗?》http://www.cnblogs.com/firelong/archive/2010/06/20/1761357.html  中发布的博文,评论者众。似乎触动了.NET社区每个人的奶酪——我那么喜欢C#的那些特性,firelong凭什么指责它们,大呼小叫的屎盆子便扣将过来。

 

Firelong既然写了帖子就有充分的技术原理依据,和工程实战依据。没有动谁奶酪的意思,只是善意提醒。也不会怕扣屎盆子。更不是为了博眼球,骗点击量——firelong儿子都四岁了,早过了穿奇装衣服、批黄头发吸引人注意的年龄了。

 

Firelong只想与大家好好讨论问题,事实上firelong是个C#多年的研究派和实战派,对C#的感情比大多数人更强。只是firelong已经嗅到了C#发展道路上的一股歪风邪气(新功能!新功能!再来一个新功能!cool,cool,很cool!)。殊不知,编程语言是来解决软件问题的,不是一个功能集合的show场——可惜国内绝大多数.NET程序员(特别是老赵们)对语言还停留在这个认识水平上。这正是国内.NET技术社区总体相对其他技术社区(比如C++社区,比如Java社区)显得比较弱智的原因。而所谓的社区精英(老赵们)又不好好研究软件问题,而是天天告诉大家这个新功能cool,那个新功能niu的来骗取眼球。你看看人家C++社区和Java社区,早跳出了把玩语言新特性的阶段了,而是注重研究真问题。firelong看不下去国内.NET技术社区继续这样沉沦下去。这正是firelong决定写博呐喊的原因。

 

好了,言归正传,firelong讨论技术会严格遵循“摆事实,讲原理”的guidline,不会意气用事。

 

Firelong首先来谈性能问题,这是C#语言在不断塞入新功能后所带来的最严重的问题。其他问题firelong也会在后续的帖子中一一道来。由于性能问题比较复杂,firelong首先在这篇帖子中先“摆事实”,然后在后续的帖子中“讲原理”,firelong相信这样会把问题说透彻。

 

下面开始摆事实。也就是C#性能不好的事实。而且一定要是较为全面的事实,而不是拿一两款软件来说事(我也希望其他论者不要拿一两款软件说事)。我们从目前世界或者中国存在的几大类常用软件(不常用的软件不在firelong性能评价之列,因为不具代表性)开始来谈谈事实。

 

一、客户端软件

 

请大家告诉我Windows平台上有哪个流行的客户端软件是C#做的?

 

  1. 微软自家客户端:word, access, excel, outlook,IE,powerpoint, msnmessager,mediaplayer, groove, onenote, project, security essentials……
  2. 国外软件客户端:firefox, google chrome, photoshop, dreamweaver, illustrator, autodesk,quicktime,safari, ultraedit, adobe reader, acdsee…….
  3. 国内客户端:qq及各个家族产品, 迅雷,360,flashget, Foxmail,暴风影音,金山词霸,优化大师,傲游,电驴,pplive,ppstream,阿里旺旺,飞信(以前用过C#开发,后来受不了改回C++了)……..

 

任何一个领域,大家能找出哪怕1-5款在全世界或中国流行的客户端软件是用C#写的吗??? 请反方同学回答该问题。

 

其实不止飞信,firelong好几个朋友在腾讯、金山等公司做研发工作,他们都仔细评估过C#做客户端的性能问题,最后得出来的结论无一不是放弃C#。特别搞的是其中有一个公司的首席架构师就是从微软总部挖过来的,大家都以为他最支持C#,没想到他否定C#否定的最厉害。

 

就连VS 2010(这个就算我们程序员自己的客户端吧)也是C/C++做的(别把用.net搞了一点界面就说VS是.net做的,vs用.net做的少的可怜的代码量可以从GAC这里C:\Windows\assembly看microsoft.visualstudio开头的部分来得出自己的结论)

 

至于Windows操作系统——这算最大的客户端了吧!我压根就没期望这辈子能看到它用.NET开发!参见李开复博客:http://blog.sina.com.cn/s/blog_475b3d560100h4il.html ,注意其中几句话:

1. “盖茨定位的Windows Vista的三大目标是:支持新语言C#,所有操作系统软件都改用C#来写。因为C#语言的运行较慢,但是开发速度很快,这样微软不会落后于多人参与的开源Linux操作系统的发展。”

2. “因为技术的瓶颈已经到了极限,很多总监看到这个设想就倒吸了几口凉气:“技术难度太高了!C#这么慢,怎么能做操作系统啊?数据库不够快啊?怎么可能当做档案系统?””

3. "经过了三年的奋力拼搏,微软视窗团队的工程师们都已经疲惫不堪。但是,Windows Vista的成功却似乎遥遥无期。其实灾难早就在酝酿,因为大家在一开始就知道,这个伟大的计划实现起来,其执行难度实在是太大了!"

 

目前,我所知道的使用.NET做的算个稍微有点规模、有点含量的客户端,也就是Expression Studio(微软自己用WPF开发的)——firelong孤陋寡闻,如果大家知道更多的,请指出。千万别拿codeplex里面的玩具软件说事!你看看那里的软件除了将程序员作为用户,有多少软件是为真实的用户写的?别说.NET出来得晚,很多软件还没来得及用.NET做。.NET从2000年开始推出,到今天已经10年了,能干的话早该干了!

 

我本以为Expression Studio微软会用什么C#性能提升秘籍来搞,提振大家对C#的性能信心,希望研究学习学习。但是我真正跑了几次就郁闷了,我估计它几年后的命运和Windows Vista差不多。

 

有人说只拿客户端软件说事,不公平。那么我们来拿网站(当今世界上对人类最重要的软件就是网站了,对吧!)说说。

 

二、互联网软件

 

大家可以到这里来看:http://www.alexa.com/topsites  Alexa全球前500大的网站,请数一数其中除了微软自己的网站为了dogfood的广告外,有几个是.NET开发的?——何况即便是微软自己的网站,也只是部分地用了.NET。

 

或者不相信Alexa的话,到这里:http://www.google.com/adplanner/static/top1000/ 看看google对全球前1000名的网站排名中,数一数有几个是.NET开发的?

 

如果你懒得看Alex或者Google的排名。我在这里贴出一些典型的网站,大家看看:

google.com,facebook.com,youtube.com,yahoo.com,live.com,wikipedia.org,baidu.com,blogger.com,msn.com,qq.com,twitter.com,yahoo.co.jp,google.co.in ,taobao.com,google.de ,google.com.hk ,wordpress.com,sina.com.cn,amazon.com ,google.co.uk,ebay.com,bing.com,163.com,youku.com,sohu.com,tudou.com,sogou.com,hao123.com,tianya.cn,kaixin001.com,alibaba.com………

 

你可别说其中用了一个Silverlight插件,就说那个网站是.NET开发的!

 

有人又说了,你别光拿用户看得见,摸得着的软件说事啊,C#做了好多用户看不见的软件啊。那我们来看看用户看不见的软件中最关键的部分:服务器软件。

 

三、服务器软件

 

1.  微软自家服务器:biztalk, sharepoint, exchange, ISA, OCS, Sql server……

2.  其他厂商的:oracle, websphere, weblogic, mysql, Sybase, db2, aphache, vmware……

 

行了不用把省略号写下去了吧。国内厂商,对不起这块没什么牛叉的服务器。

 

写到这里,我的问题出来了:C#自2000年问世以来,在全世界或者全中国,到底搞出来了几个响当当的,能拿出手的,亿万用户喜闻乐见的软件了? 别说C#还年轻,10年在技术界算老人了! 我相信立即会有一大堆人怒吼:企业应用啊!这就对了,firelong给企业应用的解释就是“即便性能不咋样,客户也可以接受的软件叫企业应用!”

 

四、给老赵的问题

 

最后一个问题提给老赵,老赵不是最近去了盛大吗?仍然在写.NET吧?老赵可不可以告诉大家盛大的核心游戏平台上的软件(服务端、或者客户端都可)是.NET写的吗? 如果是,我佩服五体投地。

 

如果不是,老赵能否向盛大CTO建议采用.NET来写盛大的游戏平台(服务端、或者客户端都可)。老赵在其中用linq给排排序(多优雅啊!),用reflection给动态加载加载(多灵活啊!),用dynamic和其他软件互操作操作(多方便啊!),用attribute给类标记标记(多曼妙啊!),用jit编译器让盛大的游戏跨跨平台(多牛叉啊!)???????

 

希望老赵不要回避这个真正的问题,千万别说游戏平台是系统内核底层应用,所以没有用C#——人家safe360是系统内核底层级软件,游戏软件可不是,游戏软件是典型的高级软件,游戏场景里面一大堆一大堆的object,不是正符合老赵等.NET拥趸口口声声的高级抽象吗???

 

如果老赵在盛大写的不是游戏平台上的软件,那么firelong烦请老赵告诉.NET社区自己在盛大写的软件是什么?很senior很senior的企业应用吧:)。

 

最后结语

 

所有所有这些软件压根没有用C#,或者经过调研、或者经过实际部署应用,但最后都放弃了C#的原因是什么???性能!性能!性能!

 

去年在上海参加.NET技术大会碰见.NET技术的大佬Jeffrey Richter,在论坛阶段我问了Jeffrey Richter两个问题:“1. .NET性能什么时候才能提上来?   2. 微软为什么自己的绝大多数软件都不用.NET开发?” Jeffrey Richter回答“1. 我相信我有生之年能看到  2. 微软自己主要用C/C++,但是鼓励开发者使用C#”。

 

听到Jeffrey Richter这两个回答,firelong当时有两个感想:

1.  Jeffrey Richter看上去还很年轻,有生之年是1万年吗,兄弟们等得起吗(技术行业10年光景相当于1万年!不知道要埋葬多少技术!)

2.  微软真伟大,难的都留给自己,容易的都留给开发者,真伟大啊真伟大!

 

我想写到这里,大家应该理解我第一个帖子的缘由了。

 

醒醒吧,朋友们,别再在老赵们编织的“新功能!新功能!再来一个新功能!cool,cool,很cool!”的童话中写代码了,真正牛叉的编程语言就要编写出像IE、adobe reader,facebook,QQ这样亿万人使用的牛叉的软件出来!

 

如果你说用C#开发你们公司一个小asp.net网站,或者几百人使用的什么企业应用(firelong太讨厌企业应用这个词了,不就是读读数据库吗,搞那么神乎其神干嘛!),你说.NET性能很好,那我没话说。

 

但是,你要开发成千上百万,甚至几亿、几十亿用户都使用的软件、网站、或者服务器、中间件,你还坚持使用C#开发,除非你自己做老板!不过请记住:Larry Page,Sergey Brin,Mark Zuckerberg,JeffBezos ,Jack Dorsey、李彦宏,马云,马化腾,丁磊不会比你傻。

 

好了,Firelong本帖已经摆完了事实。请大家也先摆事实开始来PK。在PK之前希望大家遵循前贴:技术社区辩论的Guidlines & Patterns之倡议(http://www.cnblogs.com/firelong/archive/2010/06/21/1762054.html)。

 

下一帖firelong将“讲原理”,即解释C#性能为什么这么慢(也就是firelong最开始的帖子希望C#砍掉的那些语言构造存在什么样的性能问题)——firelong在项目中研究这些个问题2年多了,性能优化技巧也用了很多了,将在下帖中一一列出。

 

firelong已经酝酿好了,只待这个帖子供大家pk充分后再下笔。Firelong应该会在1星期内再写下一帖:C#会重蹈覆辙吗?系列之2:论C#性能问题之原理。

 

谢谢等待!

posted on 2010-06-22 03:33  firelong  阅读(18089)  评论(344编辑  收藏

导航