background image

1:有帖子说:.net

 

程序再运行一次并不会更快。 许多人误解为:.net 程序第一次运行时会被编

译成本地代码,所以再次运行会更快。但遗憾的是,其实每次运行,那些 IL 都会被翻译一次,

 

不会保留下 来。所以并不会变快。但为什么有时候真的觉得快了呢?网站建设知识其实所有程
序都是这样,这是 Windows 再为你缓存用过的组件。真正需要 CPU

 

时间的 程序,多运行是不

会加快速度的。
但是我学习 java 的时候好像是编译一次就编程二进制程序,所以这是不是两者的区别?

这一点我认为好像是错的,很多资料说 JIT 足够智能,能判别该代码是否已经被编译成本地代

码。

其实双方说的都没错,JIT 会编译成二进制代码 load 到内存里,凡事已经被编译的模块,不会进

行第二次编译了,但重启系统后,又要重新编译一次的。

有 NGen.exe 代码生成器,可以在程序运行前直接生成二进制文件。这样可以加快第一次的运行

效率。但是商家不能把 NGen 生成的文件作为发布文件,因为有很多的问题。详细请看:百度搜

藏的的文章。
java 也有代码生成器。我以前误解了,其实速度的影响仅限定于第一次的启动。以后 load 到内

存中,其实速度都一样。如果 NGen 生成文件,在内存比较小的机器上运行,可能基地址没找

好,让程序内所以的地址(因为是静态编译的)全部发生偏移,这样第一次 load 反而会不如 JIT

解析到内存的快。

2:由于存在 IL 被翻译成本地代码的过程,.net 程序的确要消耗一部分时间。网站建设知识但

是.net 程序仍然具有很高的效率,这一点许多 Java

 

虚拟机都 比不上,这是为什么呢?因为多

数.net 程序内含的代码很少,几乎都是调用.net Framework 中的类库,而这些类库在.net 
Framework 安装的时候全部编译成为本机优化的本地码,并保存在程序集缓存里面。有了这个

 

程序集缓存,你程序事实上的大部分已经是高效的本地代码, 所以当然快了。但是,如果你进
行大量数值计算类的操作,还是能够感到第一次运算的速度明显下降。所以建议大家将计算密集

 

型的程序分离出来,编译成本地代码 并保存在程序集缓存中,以后使用起来就很快了。
那 java 是这样运行的么?

3:凡是中介语言的程序(不论是 Java、.NET,还是别的语言),在运行时实时地被转换到机器

语言的过程,都可以被称作 JIT Compilation

4

 

:我问: .NET 有和 JAVA 相对应的这两个功能嘛?

    a:RCP。现在 rcp 炒的很火,因为结合了 B/S   

和 C/S 的优点,推广的很迅速。eclipse 插件

下,做 rcp 已经很成熟了。我还不知道现在.net 有没有类似的功能?
    答:n 年前就有的 Smart Client、Click Once 之类的东西

    b:EMF,建模框架。很高级又底层的应用,开发出来的东西都很有意思,不知道.net 有没有

类似的功能?
    答:Entity Framework

5:c#的 Property 和 JAVA 的 get,set

至少 Property 能通过反射知道一个类有几个 Property,不知道 java 的 getset 能否实现该功

能。

6:java 的 package 是和文件的物理位置对应的。既然一个文件只能有一个文件路径,那么这

个文件的 package 也是唯一的。但是 c#不同,namespace 是虚拟的,一个 cs 文件可以同时写

多个 namespace。

7

 

:在 Java 

 

中,我们可以使用类关键字来创建作为没有方法的类的复合数据类型,但是 C# 为

 

此提供了 struct

 

,同 C 中一样。

8

 — 

:函数指针

C# 

 

提供一个称为 delegate 的构造来创建类型安全的函数指针。Java 没有任何

与之对等的机制。
9

 

:对值类型封装的不同:

与 C#一样,java 也对基本类型进行了封装,int 封装出 Integer 类,boolean 封装出 Boolean

 

类。这样一来,基本类型就突破了 值类型的限制,获得了面向对象的好处。然而,与.NET 不

同,java 中的封装类是真正的引用类型,比如在 java

中用 ==”

 

比较两个封装类对象,尽管 值