说真的,我也开始觉得大家认为“firelong是dudu请来的公关”这种理论是有道理的。因为这位英雄一开贴就炸出一个大坑,众多博客园中的老一辈已经出现了很多。这不,我宣布了无限期潜水都跳出来了,搬出去的Jeffrey也在这里面不停的回复。哈哈,知道我还看到了谁?装配脑袋哦!嗯,不知道接着灵感之源是否会出现。这真像是一个大狂欢啊!(怀念过去博客园那种讨论气氛。)
不过我也确实感觉到:这会不会是博客园历史发展上的一个重要事件呢?比如说,这是老一批博主聚得最齐的一次聚会,或者以后我们会发现博客园的娱乐化开始是以这一个事件作为其起始标志的呢?例如,这几篇文章被标注为“C#语言之争”话题,多少有点误导观众,甚至是起到一种娱乐化的效果。
言归正传,C#确实是“慢”(假如跟C/C++比的话),我从来没有否认。不过我过去会、现在会、将来还是会纠正那么一把:那是.NET
Framework及其底层机制慢。firelong其实已经自己证明了这一点,他说,MetaData是慢的一个重要原因。MetaData本来就不是C#语言本身必须的一个特征,否则firelong也不会提出要把这个该死的东西给删掉。firelong你又何必一边强调“我们谈C#,就是在谈.NET
Framework”,一边又在谈其实和C#没有关系的东西呢?你这让装配脑袋这些实用VB.NET的兄弟们情何以堪啊!要知道,使用VB.NET的人,也不算在少数。其实,我们可以大大方方的谈论.NET
Framework的性能瓶颈,而没有必要非要拉上C#陪葬,对吧?(嗯,后面会稍微呼应一下。)
重要提示:我真的从来没有说过C#比什么都快,或者.NET
Framework不存在可以提升性能的地方,也没有说过.NET或者C#不存在累赘或者不合理的设计。我之前回firelong的文章,不是说firelong说的是错的,或者不是事实,而是说他的论述过程不严谨,甚至语言词汇使用的也不严谨。firelong说的是对的,或者他说的是一个事实,自然也不是你应该从此得到的结论。请大家在我的帖子里面评论的时候少说“嗯,C#就是快,xxx是叛徒。”或者“C#就是慢,楼主你还好意思不承认,青鸟出来的吧”。如果这样,你至少犯了三个错误:
1、你压根没仔细读懂我的文章,或者明知不该为而为之,因为我已经劝你别这么做了;
2、你跑题了, 我这里确实不打算讨论这个问题;
3、你使用的字眼给你自己贴了一个很不好的标签。
[慢]
再次给所有使用、或者打算使用C#的,同时看到此文的人认真体会我这句强调了无数遍的话:.NET
Framework及其底层机制,决定了你开发出来的程序比使用完全相同算法的C/C++开发出来的程序,无论是大小还是速度上,都不会占到什么便宜。在开始选型之前,要小心谨慎的衡量这一点。比如说:其内存占用会多出来大约5MB到20MB不等,因为.NET
Framework一次会加载整个类库,不能够说你想要拿一个方法、函数或者类,就只在最终编译出来的可执行文件中仅包含他们(你不能选择静态连接),当然你也不能够选择不要Meta(一般如果是ASP.NET,保守估计,可能会占你100MB,不过有人也做实验了http://www.cnblogs.com/Ivony/archive/2010/06/24/1764677.html,说Meta不会一次全都加载进去。我没仔细看,大家可以看看)。高性能密集运算时间综合看,其运行所需时间大约是其2-3倍。当然,这是一个很复杂的问题,比如循环相加int没有什么差别,但别的可能差10倍以上也不一定,上述2到3倍是一般正常的“综合油况”。
打一个补丁有人说,你那个2-3倍空口无凭,是一种臆测。嗯,我确实需要承认,我当时没有把我为什么这么说的依据明确的写出来。不过如果认真看过firelong文章C#会重蹈覆辙吗?反射及元数据的性能问题的同学,应该也会看到另外有人写了一个帖子:C# vs C++
全局照明渲染性能比试这里面我们姑且认为是一个较为完整的程序,而且还是CPU密集型的。而我的原话说“高性能密集运算时间综合看,其运行所需时间大约是其2-3倍”的结论,主要是根据这里面得到的一个结果,而且我也说了大约,毕竟只是一个小测试。后面说,“当然,这是一个很复杂的问题,比如循环相加int没有什么差别”,这个我在之前的回firelong之C#慢里面已经提到过了。后面我接着说,“但别的可能差10倍以上也不一定”,大家注意,我说的时可能,万事皆有可能嘛。好,如果还是觉得我说的一点根据也没有,我也承认这里我之前是没有给出例子的,我这里就给补上:
http://shootout.alioth.debian.org/u64/performance.php?test=fasta
联系客服