读《CLR via C#》差点毁三观~
读了《CLR via C#》后,知道了它的作者Jeffrey Richter。真的是大神啊~
书中有一段话差点毁了我的世界观,价值观和爱情观:
“虽然这样说很难让人信服,但许多人(包括我)都认为托管应用程序的性能实际上超过了非托管应用程序。有许多原因使我们对此深信不疑---例如,当JIT编译器在运行时将IL代码编译成本地代码时,编译器对执行环境的认识比非托管编译器更深刻。”
“JIT编译器能判断代码是否运行在一个Intel Pentium 4 CPU上,并生成相应的本地代码来利用Pentium 4支持的任何【特殊】指令,相反,非托管代码通常是针对通用的、具有最小功能集合的CPU编译的,不会使用提升应用程序性能的特殊指令。”
后来百度了下Jeffrey Richter的其他作品,好像都很经典... 学C#到一定程度,就要开始学整个.NET CLR而不再是语言本身咯~~
这本书读了真是受益匪浅~~~~ C# CLR Jeffrey --------------------编程问答-------------------- 这观点我也说过。 --------------------编程问答--------------------
以前一直认为IL代码拼不过本地代码,看他这么说,是非常非常有道理..
Microsoft还没有把JIT编译器优化到最佳,提升的空间好大~ --------------------编程问答-------------------- 比如:
http://bbs.csdn.net/topics/340088244
有多少人能理解呢?非要CLR via C#写了才恍然大悟。
事实上,我说了,程序的性能不能孤立地看,要看到一个程序在多次运行中是否良好,在各种数据输入中是否运行良好,在不同机器上运行是否良好。尤其是,这些条件不是等概率出现的,所以总体性能和形而上学地看孤立的“性能优化”是两回事。 --------------------编程问答-------------------- 其实就是说,中国的人工还是拼不过别人的机器,中国还是不要发展计算机了吧
--------------------编程问答-------------------- 如果你多一点自己的思考,比看书的结论,并且觉得“有道理”收获更大。
我打一个比方,你知道本地代码在特定的硬件上很快,但是换了硬件就不行了。
你能联想别的么?
比如冒泡排序,可能在对有序的数据排序的时候,比快速排序还快,但是综合不同的数据输入,它的整体效率不如后者。 --------------------编程问答-------------------- 我们不单纯看局部得失,我们主要看全局得失
比如淘宝们搞分布式缓存,在局部判定上分布式的各种判定规则肯定是相当复杂而且无效率滴,但是总体上他很好就不错了 --------------------编程问答--------------------
只是发个读书感而已..怎么你比我还激动 --------------------编程问答-------------------- 程序员一般都很聪明,但容易偏颇,打个比方,比如体育界刘翔,他跑11秒多,你一开始跑14秒,通过努力,你能跑到13秒了,对你来说是个很大的提高,但是刘翔的广告价值有多少,你的价值又有多少,别说是13秒多了,第二的史冬鹏,又怎么样?
不知你能理解吗?
如果微软的技术能使一个机器生成的代码能比一个人所写代码都性能高,你搞技术还有什么意义。用.net 的和那些用word ,excel的又有什么区别?
--------------------编程问答--------------------
同样的道理,高铁快还是飞机快。似乎是一个不用问就知道的问题。但是未必那么简单。 --------------------编程问答-------------------- 同样毁三观............... --------------------编程问答-------------------- 说到“毁三观”,我觉得龚丽娜才是越来与“毁三观”。她现在搞得所谓“中国现代艺术”已经脱离了民族,成了专门给欧洲人在街头上“卖的”中国艺术了,而不是中国艺术了! --------------------编程问答-------------------- 法海,你为什么不懂CLR啊? --------------------编程问答--------------------
什么跟什么嘛= = --------------------编程问答-------------------- 楼主太小看微软了。 --------------------编程问答-------------------- --------------------编程问答--------------------
好多流弊人回帖。菜鸟一号飘过 --------------------编程问答-------------------- 好多流弊人回帖。菜鸟一号飘过 --------------------编程问答-------------------- 烂人写的代码底层调的再优也白搭,就像儿子不争气,再多的家底也白搭。除非你爸是李刚。 --------------------编程问答-------------------- JIT编译器再怎么优化,也优化不掉 对象的间接寻址 与 数组的随机越界判断。
虽然理论上可以说对于不同的应用,各有各的好处。但是实际上呢? --------------------编程问答--------------------
实际上就是因为C#的门槛比较低,所以好多人都混进门来搞C#,导致C#开发人员的平均素质比较低下,然后生产出很多垃圾把C#给搞臭了。
我感觉C#和相声基本是同一种形势,门槛低,相声有嘴就能说,C#,有手就能搞,都不需要有脑。结果就是鱼龙混杂,被别人瞧不起,而且行业整体也不够景气。 --------------------编程问答-------------------- okgood 呢? --------------------编程问答-------------------- 这本书知名度太大了,一直都想拜读 --------------------编程问答-------------------- 也不能说托管代码就是用CPU的最小集 只是说会不怎么跟得上时代 很多软件的要求上面写了需要什么什么CPU 其实就是说这个CPU对于他而言就是个最小集 --------------------编程问答--------------------
... --------------------编程问答--------------------
所以我不喜欢C#。还是最喜欢C。 --------------------编程问答-------------------- --------------------编程问答-------------------- 不必关心别人怎样,只要自己能够精通,什么语言都是形式。
我相信,能精通C#,也能精通C++ JAVA C等,如果一门都无法精通,再好的语言给菜鸟用,也是渣 --------------------编程问答-------------------- --------------------编程问答-------------------- 膜拜大神,C#还是很强大的 --------------------编程问答-------------------- 再多的家底也白搭 --------------------编程问答--------------------
这本书还没看完呢。
是很不错 --------------------编程问答-------------------- 肿么感觉这逻辑有问题呢?
托管应用程序的性能实际上超过了非托管应用程序 这是一个普遍的结论
论据所提到的一个原因是jit的作用,在jit生成针对特定cpu的指令 而非托管代码生成针对通用的cpu的情况下,托管应用程序的性能超过了非托管应用程序。这只是证明了在特定情况下托管应用程序的性能超过了非托管应用程序,而且这个情况举得也不是很让人信服,就好像非托管代码不能生成针对特定cpu指令似的。
事实上从应用情况来看托管应用程序的性能整体不如非托管应用程序,比如游戏开发 网络开发 还是以非托管程序为主。
--------------------编程问答-------------------- 牛逼的不是语言,而是编译器,编译器牛逼的话,易语言也可以超过C++!大家说是不是??? --------------------编程问答-------------------- 牛逼的不是语言不是编译器,而是使用语言使用编译器的思想,做到人机合一才是最高的境界,大侠用树枝也能发挥出剑的效果。 --------------------编程问答-------------------- 我写的很多C#代码比某些人写的C++代码要快 --------------------编程问答-------------------- 我期待微软出托管代码的OS,基于.NET的 OS
猜想她的名字叫 WINDOWS .NET --------------------编程问答-------------------- 买的CLR via C#刚好今天到了 果断来去看看 有没有楼主说的那么神奇。 --------------------编程问答--------------------
--------------------编程问答-------------------- 好好学习C# 达到精通一门 熟悉多门就行 --------------------编程问答-------------------- 玩 Linux 的都知道,绝大多数应用,针对 686 与针对 P4 编译的没两样,只有多媒体指令集才能看出区别。 --------------------编程问答-------------------- 这本书不错,很深入的技术书。 --------------------编程问答-------------------- 理论上的东西有多大意义要看实际应用,至少目前非托管程序的性能高于托管程序,等到哪天JIT编译器的性能真的有微软吹嘘的那么强劲再来谈这句话还不迟。 --------------------编程问答-------------------- 一本书而已, 这个作者 本身就是微软的御用 笔杆子。 对微软的东西吹捧一下很正常。
他只说 JIT可以根据CPU进行优化,有没有提到优化的效率提升到底有多少? 要知道X86新增的指令,都不是性能得到了提升,而是使用起来更方便,用一条指令代替多条指令而已。
他只说JIT可以优化,有没有提到 JIT即时编译 所消耗的时间和性能,要知道这都是在运行期发生的。
更何况,JIT的优化 是需要时间的,如果这些优化发生在运行期,它敢不计代价的去优化么?
这些只是理论上的,就活生生的例子来说,有几个人感觉到.net程序快过 原生程序?
--------------------编程问答--------------------
刚开始接触C#,很多东西要学。。。什么时候才到那种层次 --------------------编程问答-------------------- 御用文人,从来不缺少
[非托管代码通常是针对通用的、具有最小功能集合的CPU编译的,不会使用提升应用程序性能的特殊指令]
这个....
编译器的基本, 比如, Intel C++ 编译器(Intel parallel studio) ,
编译器参数 ax, Qax ,完全可以 自动指派. 目标机器如果没有对应的高级指令集,就可以常规指令集
可以支持, AVX, SSE等...
Description
This option tells the compiler to generate multiple, processor-specific auto-dispatch code paths for Intel processors if there is a performance benefit. It also generates a baseline code path. The Intel processor-specific auto-dispatch path is usually more optimized than the baseline path. Other options, such as O3, control how much optimization is performed on the baseline path.
http://software.intel.com/sites/products/documentation/hpc/composerxe/en-us/2011Update/fortran/win/copts/common_options/option_ax_lcase.htm --------------------编程问答--------------------
这个是理论上骗人的东西。实际上慢了不知道多少倍。
这个理论成立的前提是你的代码已经转为机器码,这样才会在某些机器上做指令的优化。
但是在这前后,还有你代码的解释编译调优,资源的创建,管理与释放以及上下文的调度等等,都比你区区几条指令的优化要耗时更多。
--------------------编程问答--------------------
你想要的是vista。vista慢就是因为底层用了很多.NET的东西。 --------------------编程问答-------------------- 什么类型的程序,最考验性能?
数值计算...
看看,数值计算的库: 对比下, C/C++/fortran 等 , 对比 JIT....
http://en.易做图.org/wiki/List_of_numerical_libraries --------------------编程问答-------------------- No... Vista只是一些UI或者某些功能(道听途说,具体不明).
但可以肯定的是涉及到CPU指令,文件管理,内存管理,硬件驱动是肯定没用.NET在做事的...
我期待的是Pure .NET的OS..
--------------------编程问答-------------------- 竟然还有傻子想了解CLR。 一副典型的当人家奴才和手下的命。
想学习技术没错, 但是世界上那么多开放开源的技术不学, 非要学封闭的技术, 就好比有美女不看, 非要去易做图人家的裙底风光一样。
2000年以后, 微软已经开始被世界淘汰。 微软的桌面软件, 造成微软开发者目光狭隘, 视野局限。 --------------------编程问答-------------------- clr 的软件感觉比原生代码慢,主要不是因为虚拟机,而是因为 .net 库里面有很多层的包装。这些东西如果自己用 c++ 实现,可能不会做这么全面的判断和处理。但正是有了这些判断和异常情况处理,才使得 .net 开发安全快速。
--------------------编程问答--------------------
不知道这位仁兄所说的开源技术是哪方面,你是重新编一个JAVA语言呢还是重新弄一套系统,你用开源技术你为开源技术贡献什么了,要不然你也是开源技术的奴隶和手下了。对了,你用手机电脑干嘛,自己去造一个就是了,从造芯片开始。。
您境界太高了,这世界的大多数IT人从事技术只是为了用技术换生活而已。。。
--------------------编程问答-------------------- 理论如此,但实际使用.net程序明显比本地win32程序慢 --------------------编程问答-------------------- 看你这幅没见过世面的样子 --------------------编程问答--------------------
... --------------------编程问答-------------------- 有CLR via c# 中文版电子书吗?给个下载地址 --------------------编程问答-------------------- 偶不做net,进来搀和两句
如果仅仅是针对C#,楼主引用的观点可能没错,毕竟大部分人不会针对使用的不同硬件平台做调优,而微软“可能会”
但是仅限于:
1)大部分不做针对优化的编程人员
2)微软可能做了这些优化
--------------------编程问答--------------------
呵呵,连委托和事件都不知道是怎么回事的垃圾也配在这吠叫..
笑了 --------------------编程问答--------------------
萝卜白菜,各有所爱..
至于视野这种主观的东西. 全世界都跟你一样看法的话,微软也不会存在了。
你喜不喜欢是你的事,你爱不爱,微软就在那 --------------------编程问答-------------------- --------------------编程问答-------------------- 又导致了争论 --------------------编程问答-------------------- --------------------编程问答-------------------- 他说的是性能呢,这个性能,是不是很宽泛啊
性能指标有很多蛮,基本上到核心库了都没用C#来的哇,基本C++哩
哈哈,我只是说我见到过的哈
嘿嘿,俺是c#出生的呢,发现自己很水
呵呵,低调低调,努力努力 --------------------编程问答-------------------- --------------------编程问答-------------------- 顶顶顶顶顶顶顶
--------------------编程问答-------------------- 此人和charles petzold都是微软的走狗。后者为了讨好微软,甚至在胳膊上文了一个永远蓝屏的windows徽标。 --------------------编程问答-------------------- 菜鸟二号飘过 --------------------编程问答-------------------- 路过接分········· --------------------编程问答-------------------- 此贴牛人出没.霸气外漏.在此受教. --------------------编程问答-------------------- 我心目中的高手,是愿意孜孜不倦帮新手提高的高手.不是高高在上的高手 --------------------编程问答-------------------- 小毛孩,易做图吧 --------------------编程问答-------------------- 《程序员》杂志超值订阅
全年iPad版《程序员》杂志超值套餐,只需60元噢!
确实是好书一本,刚出来就买了
顺便打酱油.. --------------------编程问答-------------------- net程序的平均性能应该是比非托管的好些。
但.net程序(比如WPF、WinForm)通常比非托管启动较慢,能明显感觉得到
请教各位,如何加快.net的程序的启动速度呢??? --------------------编程问答--------------------
那C/C++ 还有用武之地么? 开发效率不如C#,到你这里运行效率也不如C#了。 那飞信 吃饱撑的 直接把C#版扔了改用C++重写干嘛? --------------------编程问答-------------------- 打酱油的路过...... --------------------编程问答-------------------- 我.Net/C++都非常喜欢,也很尊敬Jeffrey Richter。
Jeffrey说“托管比原生快”,猜测可能只是想说明JIT确实努力做了些事,理论上让某些特定情况下的特定代码段有机会比原生快。
事实上,JIT初始化+JIT做优化的代价+JIT翻译时间+间接寻址...99.9%的大于原生代码时间。
如果不巧你的代码是那0.1%,那可以针对相应CPU做几个优化dll,运行时判断加载。然后你会发现,效率还是远高于CLI。
我曾经移植过几个C#的项目到C++,性能是主要原因。 --------------------编程问答--------------------
你可以用指针啊。。。悲催的家伙,看你说这些话,真是可怜。。。 --------------------编程问答--------------------
花也不能这么说。
语言的优劣本身就是连带编译器的。
没人不让你去搞个很强的编译器吧。。。
--------------------编程问答--------------------
看你说话,好像很牛B哦。。。不知道你是搞什么的呢?
let me tell u why!
因为开发飞信的人比较水。此其一。
其次,VC++ 已经诞生很多年,有很多代码积累,你的明白?(比如时下比较流行的:DirectUI)
另外,飞信自己搞了一个虚拟机,事实上这给程序更新带来了不少麻烦,这其实是自作自受。自己找麻烦。 --------------------编程问答--------------------
易语言不争气啊,怎么不搞个比C++还牛逼的编译器呢?至少要达到用易语言编译出来的程序运行效率比C++强十倍! --------------------编程问答--------------------
易语言使用中文编程,说实话,中文真的不适合编程,因为中文字,代码一多,看起来太累了。。。
其次,c++编译器似乎普遍速度比较慢,不知道是不是我自己的问题。。。。
我的电脑上C++编译器速度比较慢。
而且,C++编译器编译代码会产生一大堆东西。。。
其实,在这里说的童鞋档次都比较低,包括我本人也是。
连编译器都写不出。。。。 --------------------编程问答-------------------- 比如C#编译出来的程序,运行速度如坐动车!C++编译出来的程序,运行速度如坐飞机!
那易语言编译出来的程序运行速度就如坐火箭! --------------------编程问答-------------------- let me tell u why!
因为开发飞信的人比较水。此其一。
其次,VC++ 已经诞生很多年,有很多代码积累,你的明白?(比如时下比较流行的:DirectUI)
另外,飞信自己搞了一个虚拟机,事实上这给程序更新带来了不少麻烦,这其实是自作自受。自己找麻烦。
------------------------------------
C#程序员的逻辑一贯如此,c#软件慢,都怪C#程序员水,OK,那么为什么C#程序员如此之水呢?是不是C#语言本身就容易催生水货程序员呢?
vs2003出来也有十个年头了,照说C#累积代码也不少吧?
飞信啥时候自己搞了虚拟机了? 它不过是把.net 框架打包了而已,它有能力自己做虚拟机,飞信也不会做这么烂了。 --------------------编程问答--------------------
说的不错,但是C#有些东西由于先天的缺陷,即使是这么久了也积累不下什么。比如靠近底层的。
还有,你要明白程序语言也是有先来后道的。就好像,开发PC游戏,Dx SDK 本身是C++,而且业界一向主要用C++。。。这么多年了,网络上的知识和资源积累也都是C++。。。你突然要用C#。。。。虽然C#语言本身比较优秀,但是 那些用C++已经开发了很多年的同学又怎么会砸自己的饭碗呢。。。而且还要弃成熟思路,冒风险接受新兴的事物。。。 --------------------编程问答-------------------- 原则上说C#相对不容易催生不良的设计和代码。由于限制相对(像C++这样的语言)多一些,程序员可以跟集中精力地设计C#编译器能够比较好地优化的逻辑实现需求,这也从某个侧面说明为什么总体上说对C#程序的执行性能不比过分担忧。至于底层一些的,这暂时是没办法的,当然目前完全可以用unsafe、P/I或者CLI等手段去做。 --------------------编程问答--------------------
瞎说。飞信使用的是当时(包括现在)很难找到、非常奇葩的Salamandar。不是什么“自己搞了一个虚拟机”。
任何事情都应该实验,只不过当时飞信没有醒悟得早一些而已。如果早一点,那么就没有必要打包那个有着20多M大的Salamander,而直接在安装程序中集成.net 2.0就好了。
至于说c++版,实际上在飞信产品研发之前两年就有一个c++版程序,是与飞信(之前是腾讯给中移动做的161手机交友和速配)相接的,只是一直是1、2个开发人员个人玩儿,没有很正规地作为一个项目让4、5个人去开发而已。飞信后来内部产生“大战”这很可能导致了拿产品去攻击别人,而没有真正去研发。
话说回来,飞信那类的IM客户端程序其实非常简单。你可以看到不但有PC版本,也有各种手机版本。实际上复杂的事服务器端系统,而客户端系统可以用各种编程语言甚至某些扯淡的“易语言”,只要知道服务器端api就可以开发了。因此客户端开发“人员”自身的素质是决定因素,而不是什么编程语言。 --------------------编程问答-------------------- 关于纠结于“底层驱动”的问题,其实就好像设计别墅区、你必定要一些底层民工一样。对于c程序员(而不是c++程序员)就用做底层驱动开发人员就好了,不会开发底层驱动的程序员,不要听他们吹什么“c语言好啊”之类的话;对于会开发驱动的程序员,只要有一个就够了,让他们踏实地成年累月死抠、抄袭那一点c代码就行了。
而项目经理的则往往需要层次比较高的开发人员来顶替,而不是死抠底层编程语言的人。 --------------------编程问答-------------------- 比如说有些人“死抠”一些bmp图片进行分析,这样的人一定会对一些编程语言的看法与我们不同,这样人对于软件开发中的“层次感”与项目经理是正好相反的。一个公司有一个这样的人就够了,(可能)就能够去做一些图片分析的项目了(例如分析卫星数据),因为真正的算法知识不需要这些人研究(需要一大堆博士硕士去研究),这些编程的人只是代码民工而已。
这样就回到了实际应用。我们假设都是开发人员,那么我们应该了解地底层还是瞧不起底层呢?
实际上没有一定的是非,而是靠实践来回答这个问题。 --------------------编程问答--------------------
多谢指点,我也只是略知一二。学习啦, --------------------编程问答-------------------- 话说,现在的硬件都这么牛逼了,就算软件是少了那么点性能又能如何呢 --------------------编程问答--------------------
---------------------------------------------------------
明显是个NC --------------------编程问答--------------------
俗话说一般说别人是什么的自己一般不必那个东西好到哪里去,请问这位仁兄是个啥东西啊? --------------------编程问答-------------------- 菜鸟二号飘过!!!话说电子书上传不成功。要怪就怪CSDN吧,说什么文件太大,扯蛋!!! --------------------编程问答-------------------- 还是欣赏vala,它既有别于cpp,又有别于c#,,这二者都用了编译,解释,等传统的技术。。
而vala,只做了一下转换,而且针对gtk c runtime,它的compiler实际上是translator,,,既避免了性能问题,又避免了cpp对于c developers在学习曲线上导致的sudden change。。。
可谓中间路线。
补充:.NET技术 , 非技术区