读《CLR via C#》差点毁三观~

问题描述

读了《CLRviaC#》后,知道了它的作者JeffreyRichter。真的是大神啊~书中有一段话差点毁了我的世界观,价值观和爱情观:“虽然这样说很难让人信服,但许多人(包括我)都认为托管应用程序的性能实际上超过了非托管应用程序。有许多原因使我们对此深信不疑---例如,当JIT编译器在运行时将IL代码编译成本地代码时,编译器对执行环境的认识比非托管编译器更深刻。”“JIT编译器能判断代码是否运行在一个IntelPentium4CPU上,并生成相应的本地代码来利用Pentium4支持的任何【特殊】指令,相反,非托管代码通常是针对通用的、具有最小功能集合的CPU编译的,不会使用提升应用程序性能的特殊指令。”后来百度了下JeffreyRichter的其他作品,好像都很经典...学C#到一定程度,就要开始学整个.NETCLR而不再是语言本身咯~~这本书读了真是受益匪浅~~~~

解决方案

解决方案二:
这观点我也说过。
解决方案三:
引用1楼caozhy的回复:

这观点我也说过。

以前一直认为IL代码拼不过本地代码,看他这么说,是非常非常有道理..Microsoft还没有把JIT编译器优化到最佳,提升的空间好大~
解决方案四:
比如:http://bbs.csdn.net/topics/340088244有多少人能理解呢?非要CLRviaC#写了才恍然大悟。事实上,我说了,程序的性能不能孤立地看,要看到一个程序在多次运行中是否良好,在各种数据输入中是否运行良好,在不同机器上运行是否良好。尤其是,这些条件不是等概率出现的,所以总体性能和形而上学地看孤立的“性能优化”是两回事。
解决方案五:
其实就是说,中国的人工还是拼不过别人的机器,中国还是不要发展计算机了吧
解决方案六:
如果你多一点自己的思考,比看书的结论,并且觉得“有道理”收获更大。我打一个比方,你知道本地代码在特定的硬件上很快,但是换了硬件就不行了。你能联想别的么?比如冒泡排序,可能在对有序的数据排序的时候,比快速排序还快,但是综合不同的数据输入,它的整体效率不如后者。
解决方案七:
我们不单纯看局部得失,我们主要看全局得失比如淘宝们搞分布式缓存,在局部判定上分布式的各种判定规则肯定是相当复杂而且无效率滴,但是总体上他很好就不错了
解决方案八:
引用5楼caozhy的回复:

如果你多一点自己的思考,比看书的结论,并且觉得“有道理”收获更大。我打一个比方,你知道本地代码在特定的硬件上很快,但是换了硬件就不行了。你能联想别的么?比如冒泡排序,可能在对有序的数据排序的时候,比快速排序还快,但是综合不同的数据输入,它的整体效率不如后者。

只是发个读书感而已..怎么你比我还激动
解决方案九:
程序员一般都很聪明,但容易偏颇,打个比方,比如体育界刘翔,他跑11秒多,你一开始跑14秒,通过努力,你能跑到13秒了,对你来说是个很大的提高,但是刘翔的广告价值有多少,你的价值又有多少,别说是13秒多了,第二的史冬鹏,又怎么样?不知你能理解吗?如果微软的技术能使一个机器生成的代码能比一个人所写代码都性能高,你搞技术还有什么意义。用.net的和那些用word,excel的又有什么区别?
解决方案十:
引用6楼wanghui0380的回复:

我们不单纯看局部得失,我们主要看全局得失比如淘宝们搞分布式缓存,在局部判定上分布式的各种判定规则肯定是相当复杂而且无效率滴,但是总体上他很好就不错了

同样的道理,高铁快还是飞机快。似乎是一个不用问就知道的问题。但是未必那么简单。
解决方案十一:
同样毁三观...............
解决方案十二:
说到“毁三观”,我觉得龚丽娜才是越来与“毁三观”。她现在搞得所谓“中国现代艺术”已经脱离了民族,成了专门给欧洲人在街头上“卖的”中国艺术了,而不是中国艺术了!
解决方案十三:
法海,你为什么不懂CLR啊?
解决方案十四:
引用11楼sp1234的回复:

说到“毁三观”,我觉得龚丽娜才是越来与“毁三观”。她现在搞得所谓“中国现代艺术”已经脱离了民族,成了专门给欧洲人在街头上“卖的”中国艺术了,而不是中国艺术了!

什么跟什么嘛==
解决方案十五:
楼主太小看微软了。
解决方案:

解决方案:
好多流弊人回帖。菜鸟一号飘过
解决方案:
好多流弊人回帖。菜鸟一号飘过
解决方案:
烂人写的代码底层调的再优也白搭,就像儿子不争气,再多的家底也白搭。除非你爸是李刚。
解决方案:
JIT编译器再怎么优化,也优化不掉对象的间接寻址与数组的随机越界判断。虽然理论上可以说对于不同的应用,各有各的好处。但是实际上呢?
解决方案:
引用19楼sbwwkmyd的回复:

JIT编译器再怎么优化,也优化不掉对象的间接寻址与数组的随机越界判断。虽然理论上可以说对于不同的应用,各有各的好处。但是实际上呢?

实际上就是因为C#的门槛比较低,所以好多人都混进门来搞C#,导致C#开发人员的平均素质比较低下,然后生产出很多垃圾把C#给搞臭了。我感觉C#和相声基本是同一种形势,门槛低,相声有嘴就能说,C#,有手就能搞,都不需要有脑。结果就是鱼龙混杂,被别人瞧不起,而且行业整体也不够景气。
解决方案:
okgood呢?
解决方案:
这本书知名度太大了,一直都想拜读
解决方案:
也不能说托管代码就是用CPU的最小集只是说会不怎么跟得上时代很多软件的要求上面写了需要什么什么CPU其实就是说这个CPU对于他而言就是个最小集
解决方案:
引用20楼wddw1986的回复:

引用19楼sbwwkmyd的回复:JIT编译器再怎么优化,也优化不掉对象的间接寻址与数组的随机越界判断。虽然理论上可以说对于不同的应用,各有各的好处。但是实际上呢?实际上就是因为C#的门槛比较低,所以好多人都混进门来搞C#,导致C#开发人员的平均素质比较低下,然后生产出很多垃圾把C#给搞臭了。我感觉C#和相声基本是同一种形势,门槛低,相声有嘴就能说,C#,有手就能搞,……

...
解决方案:
引用20楼wddw1986的回复:

引用19楼sbwwkmyd的回复:JIT编译器再怎么优化,也优化不掉对象的间接寻址与数组的随机越界判断。虽然理论上可以说对于不同的应用,各有各的好处。但是实际上呢?实际上就是因为C#的门槛比较低,所以好多人都混进门来搞C#,导致C#开发人员的平均素质比较低下,然后生产出很多垃圾把C#给搞臭了。我感觉C#和相声基本是同一种形势,门槛低,相声有嘴就能说,C#,有手就能搞,……

所以我不喜欢C#。还是最喜欢C。
解决方案:

解决方案:
不必关心别人怎样,只要自己能够精通,什么语言都是形式。我相信,能精通C#,也能精通C++JAVAC等,如果一门都无法精通,再好的语言给菜鸟用,也是渣
解决方案:

解决方案:
膜拜大神,C#还是很强大的
解决方案:
再多的家底也白搭
解决方案:
这本书还没看完呢。是很不错
解决方案:
肿么感觉这逻辑有问题呢?托管应用程序的性能实际上超过了非托管应用程序这是一个普遍的结论论据所提到的一个原因是jit的作用,在jit生成针对特定cpu的指令而非托管代码生成针对通用的cpu的情况下,托管应用程序的性能超过了非托管应用程序。这只是证明了在特定情况下托管应用程序的性能超过了非托管应用程序,而且这个情况举得也不是很让人信服,就好像非托管代码不能生成针对特定cpu指令似的。事实上从应用情况来看托管应用程序的性能整体不如非托管应用程序,比如游戏开发网络开发还是以非托管程序为主。
解决方案:
牛逼的不是语言,而是编译器,编译器牛逼的话,易语言也可以超过C++!大家说是不是???
解决方案:
牛逼的不是语言不是编译器,而是使用语言使用编译器的思想,做到人机合一才是最高的境界,大侠用树枝也能发挥出剑的效果。
解决方案:
我写的很多C#代码比某些人写的C++代码要快
解决方案:
我期待微软出托管代码的OS,基于.NET的OS猜想她的名字叫WINDOWS.NET
解决方案:
买的CLRviaC#刚好今天到了果断来去看看有没有楼主说的那么神奇。
解决方案:

解决方案:
好好学习C#达到精通一门熟悉多门就行
解决方案:
玩Linux的都知道,绝大多数应用,针对686与针对P4编译的没两样,只有多媒体指令集才能看出区别。
解决方案:
这本书不错,很深入的技术书。
解决方案:
理论上的东西有多大意义要看实际应用,至少目前非托管程序的性能高于托管程序,等到哪天JIT编译器的性能真的有微软吹嘘的那么强劲再来谈这句话还不迟。
解决方案:
一本书而已,这个作者本身就是微软的御用笔杆子。对微软的东西吹捧一下很正常。他只说JIT可以根据CPU进行优化,有没有提到优化的效率提升到底有多少?要知道X86新增的指令,都不是性能得到了提升,而是使用起来更方便,用一条指令代替多条指令而已。他只说JIT可以优化,有没有提到JIT即时编译所消耗的时间和性能,要知道这都是在运行期发生的。更何况,JIT的优化是需要时间的,如果这些优化发生在运行期,它敢不计代价的去优化么?这些只是理论上的,就活生生的例子来说,有几个人感觉到.net程序快过原生程序?
解决方案:
刚开始接触C#,很多东西要学。。。什么时候才到那种层次
解决方案:
御用文人,从来不缺少引用

“JIT编译器能判断代码是否运行在一个IntelPentium4CPU上,并生成相应的本地代码来利用Pentium4支持的任何【特殊】指令,相反,非托管代码通常是针对通用的、具有最小功能集合的CPU编译的,不会使用提升应用程序性能的特殊指令。”

[非托管代码通常是针对通用的、具有最小功能集合的CPU编译的,不会使用提升应用程序性能的特殊指令]这个....编译器的基本,比如,IntelC++编译器(Intelparallelstudio),编译器参数ax,Qax,完全可以自动指派.目标机器如果没有对应的高级指令集,就可以常规指令集可以支持,AVX,SSE等...DescriptionThisoptiontellsthecompilertogeneratemultiple,processor-specificauto-dispatchcodepathsforIntelprocessorsifthereisaperformancebenefit.Italsogeneratesabaselinecodepath.TheIntelprocessor-specificauto-dispatchpathisusuallymoreoptimizedthanthebaselinepath.Otheroptions,suchasO3,controlhowmuchoptimizationisperformedonthebaselinepath.http://software.intel.com/sites/products/documentation/hpc/composerxe/en-us/2011Update/fortran/win/copts/common_options/option_ax_lcase.htm
解决方案:
引用楼主mrz0953的回复:

读了《CLRviaC#》后,知道了它的作者JeffreyRichter。真的是大神啊~书中有一段话差点毁了我的世界观,价值观和爱情观:“虽然这样说很难让人信服,但许多人(包括我)都认为托管应用程序的性能实际上超过了非托管应用程序。有许多原因使我们对此深信不疑---例如,当JIT编译器在运行时将IL代码编译成本地代码时,编译器对执行环境的认识比非托管编……

这个是理论上骗人的东西。实际上慢了不知道多少倍。这个理论成立的前提是你的代码已经转为机器码,这样才会在某些机器上做指令的优化。但是在这前后,还有你代码的解释编译调优,资源的创建,管理与释放以及上下文的调度等等,都比你区区几条指令的优化要耗时更多。
解决方案:
引用36楼Lost_Painting的回复:

我期待微软出托管代码的OS,基于.NET的OS猜想她的名字叫WINDOWS.NET

你想要的是vista。vista慢就是因为底层用了很多.NET的东西。
解决方案:
什么类型的程序,最考验性能?数值计算...看看,数值计算的库:对比下,C/C++/fortran等,对比JIT....
解决方案:
No...Vista只是一些UI或者某些功能(道听途说,具体不明).但可以肯定的是涉及到CPU指令,文件管理,内存管理,硬件驱动是肯定没用.NET在做事的...我期待的是Pure.NET的OS..引用47楼zanfeng的回复:

引用36楼Lost_Painting的回复:我期待微软出托管代码的OS,基于.NET的OS猜想她的名字叫WINDOWS.NET你想要的是vista。vista慢就是因为底层用了很多.NET的东西。

解决方案:
该回复于2014-01-09 17:25:36被版主删除

时间: 2024-09-19 08:15:47

读《CLR via C#》差点毁三观~的相关文章

DNSPod声仔:年少轻狂,差点当黑客

网站:http://www.DNSPod.com 类型:免费提供双线域名解析服务的网站. 站长:吴洪声,网名声仔,1985年生,广东湛江人.小学二年级时便接触电脑,制作和维护过多个网站.目前使用DNSPod解析的域名超过5000个. IT界有句笑谈:世界上最远的距离,不是南极和北极,而是电信和网通之间的距离.唯一的解决方法是使用双线服务器,但是这样又会让用户面临选择服务器的麻烦,许多大网站深受困扰.这时DNSPod系统出现了,它提供免费的网通电信智能DNS,支持双线域名解析.开发这个系统的声仔,

“差点被裁”让我看清了SEO网编真实面目

  说实话这两天过的很窘迫,因为自己所在的公司正在裁员,而自己差点就成为公司改革的牺牲品,原因也很简单,就是因为自己所做的工作在很多人看来是技术含量低的工作.事情是这样的,我在济南本地做着网编的工作,而公司要精改编制,首先就从我们这个网编小组下手,最后还是因为我工作比较努力才留了下来,虽然自己留了下来,但是心里头很不舒服,因为自己是公司率先改革的部门,这点让自己很不爽,但又无能为力,因为自己的现状的确很一般,因为就目前来看,二线城市的网编一般有以下4个毛病,首先太安于现状,天天做着ctrl+v.

CLR笔记:7.常量和字段

1.常量 常量是永远不会改变的符号.它的值必须在编译时就确定.编译后,CLR将常量的值保存在Assembly的 元数据中,这意味着常量必须是基元类型. 常量是类型的一部分,总是被当成静态成员,但并不显示声明为static. public const Int32 MaxEntriesList = 100; 当代码引用常量时,CLR在元数据中查找该符号,将提取的常量值嵌入到IL中,所以常量没有地址以及 相应的分配内存,而且不能通过引用传递变量,也就是说,在导入一个外部的DLL时,就已经将其中的常 量

并发数据结构: .NET Framework中提供的读写锁

在多线程编程时,开发人员经常会遭遇多个线程读写某个资源的情况.这就需要进行线程同步来保证 线程安全.一般情况下,我们的同步措施是使用锁机制.但是,假如线程只对资源进行读取操作,那么根 本不需要使用锁:反之,假如线程只对资源进行写入操作,则应当使用互斥锁(比如使用 Monitor 类等) .还有一种情况,就是存在多个线程对资源进行读取操作,同时每次只有一个线程对资源进行独占写入操 作.这正是本文主题--读写锁的用武之地.ReaderWriterLock 类 .NET Framework BCL 在

[CLR via C#]7. 常量和字段

原文:[CLR via C#]7. 常量和字段 7.1 常量 常量(constant)是一个特殊的值,它是一个从不变化的值. 在定义常量时,它的值必须在编译时确定.确定之后,编译器将常量的值保存到程序集的元数据中.这就意味着只能为编译器认定的基元类型定义常量.   C#是允许定义一个非基元类型的常量变量(constant variable),但这个值应设为null. public sealed class SomeType { //SomeType不是基元类型,但C#允许定义 //值为null的

[CLR via C#]6. 类型和成员基础

原文:[CLR via C#]6. 类型和成员基础 6.1 类型的各种成员 在一个类型中,可以定义0个或多个以下种类的成员: 1)常量    常量就是指出数据值恒定不变的符号.这些符号通常用于使代码更容易阅读和维护.常量通常与类型关联,而不与类型的实例关联.从逻辑上讲,常量始终是静态成员. 2)字段    字段表示一个只读或可读/写的数据值.字段可以是静态的,这时是类型状态的一部分:字段也可以是实例(非静态)的,这时字段是对象状态的一部分.强烈建议将字段声明成为私有字段,防止类型或对象状态被外部

[CLR via C#]10. 属性

原文:[CLR via C#]10. 属性 一.无参属性 对于字段,强烈建议将所有的字段都设为private.如果允许用户或类型获取或设置状态信息,就公开一个针对该用途的方法.封装了字段访问的方法通常称为访问器(accessor)方法.访问器方法可选择对数据的合理性进行检查,确保对象的状态永远不被破坏.如下代码: private sealed class Employee { private String m_Name; private Int32 m_Age; public String Ge

[CLR via C#]17. 委托

原文:[CLR via C#]17. 委托     回调函数是一种非常有用的编程机制,它已经存在很多年了.Microsoft .NET Framework通过委托(delegate)来提供一种回调机制.不同于其他平台(比如非托管C++)的回调机制,委托提供了多得多的功能.例如,委托确保回调方法是类型安全的(这是CLR最重要的目标之一).委托还允许顺序调用多个方法,并支持调用静态方法和实例方法.   一.初识委托     为了理解委托,先看看如何使用它.     委托4个最基本的步骤:     1

一个糟糕的流程差点把我的公司给毁了

摘要: 我是技术创始人经营自己公司的坚持支持者,但是技术创始人一直以来的一种做法给自身企业造成了极大的伤害,这种做法就是把预算编制过程搞砸.是的,编预算.很荒谬吧.怎么会 我是技术创始人经营自己公司的坚持支持者,但是技术创始人一直以来的一种做法给自身企业造成了极大的伤害,这种做法就是把预算编制过程搞砸.是的,编预算.很荒谬吧.怎么会这样?为什么说对于工程师来说这个问题特别大? 首先我会以自己的反面事例现身说法.我们的销售增长迅速无比,以至于我们面临的最大问题是无法应付那么多想要注册Loudclo