托管代码与非托管代码的性能比较
2010-04-27 10:09
337 查看
基本上每个人都知道的是,所有.Net语言都将被编译成为一个叫做IL汇编的中间语言。但是计算机是如何执行这个中间代码的,却是很多人不知道,甚至理解错误了的。
JIT是.NET程序运行的重要部件之一,全称是即时编译器。我刚才说的误解,就是很多人(绝对不是少数,问了很多c++程序员,10个有9个这种想法)都以为JIT其实就是跟Java VM差不多的东西,是一个Interpreter,在运行时读取IL汇编代码,然后模拟成x86代码(也就是俗称的虚拟机)。但是事实上,.NET使用的是更为高级的技术。 .Net程序被加载入内存以后,当某段IL代码被第一次运行的时候,JIT编译器就会将这段IL代码,全部编译成本地代码,然后再执行。这也就是为什么.NET程序第一次运行都启动很慢的原因! 随.NET库,微软还附带了一个工具,可以事先将.NET程序所有的IL代码都编译成本地代码并保存在缓存区中,这样一来,这个程序就跟c++编译的一模一样了,没有任何区别,运行时也可以脱离JIT了(这里不要混淆了,这里不是说可以脱离.NET库,而是说不需要在进行即时编译这个过程了)。所以,请不要将.NET和Java混为一谈,两个的运行效率根本不是一个等级的!
JIT的优化指的是可以针对本地CPU,在编译时进行优化。传统程序在编译时,为了保证兼容性,通常使用最通用的指令集(比如古老的386指令集)来编译。而JIT知道CPU的具体类型,可以充分利用这些附加指令集进行编译,这样的性能提升是很可观的。
C++中可以手动设置托管与非托管状态
这就是非托管类型:
class Foo
{
private:
int x;
public:
Foo():
x(0){}
Foo(int xx): x(xx) {}
};
这就是托管类型
__gc class Bar
{
private:
int x;
public:
Bar(): x(0){}
Bar(int xx): x(xx) {}
};
JIT是.NET程序运行的重要部件之一,全称是即时编译器。我刚才说的误解,就是很多人(绝对不是少数,问了很多c++程序员,10个有9个这种想法)都以为JIT其实就是跟Java VM差不多的东西,是一个Interpreter,在运行时读取IL汇编代码,然后模拟成x86代码(也就是俗称的虚拟机)。但是事实上,.NET使用的是更为高级的技术。 .Net程序被加载入内存以后,当某段IL代码被第一次运行的时候,JIT编译器就会将这段IL代码,全部编译成本地代码,然后再执行。这也就是为什么.NET程序第一次运行都启动很慢的原因! 随.NET库,微软还附带了一个工具,可以事先将.NET程序所有的IL代码都编译成本地代码并保存在缓存区中,这样一来,这个程序就跟c++编译的一模一样了,没有任何区别,运行时也可以脱离JIT了(这里不要混淆了,这里不是说可以脱离.NET库,而是说不需要在进行即时编译这个过程了)。所以,请不要将.NET和Java混为一谈,两个的运行效率根本不是一个等级的!
JIT的优化指的是可以针对本地CPU,在编译时进行优化。传统程序在编译时,为了保证兼容性,通常使用最通用的指令集(比如古老的386指令集)来编译。而JIT知道CPU的具体类型,可以充分利用这些附加指令集进行编译,这样的性能提升是很可观的。
C++中可以手动设置托管与非托管状态
这就是非托管类型:
class Foo
{
private:
int x;
public:
Foo():
x(0){}
Foo(int xx): x(xx) {}
};
这就是托管类型
__gc class Bar
{
private:
int x;
public:
Bar(): x(0){}
Bar(int xx): x(xx) {}
};
相关文章推荐
- [翻译]GDI on Windows Mobile--托管代码和本地代码的性能比较
- GDI on Windows Mobile--托管代码和本地代码的性能比较
- C# 托管代码 和 unsafe使用指针 对数组操作 性能比较--指针真的快么?
- 托管代码与非托管代码的执行效率比较
- 托管代码与非托管代码
- 错误:向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们
- 托管代码与非托管代码的区别
- JavaScript 解析Json字符串的性能比较分析代码
- 六、CLR下的托管代码应用程序与非托管代码程序之间的性能对比
- 什么是“托管(managed)”\ 如何与非托管代码交互?
- 托管与非托管代码
- 托管代码和非托管代码
- 各种GIT代码托管工具比较
- 托管和非托管代码
- .net 托管代码与非托管代码
- ASP.NET中常用的26个优化性能方法---将调用密集型的 COM 组件迁移到托管代码
- python和c性能比较,以及用dll优化python代码
- C# CLRInsideOut 托管代码与非托管代码互操作,产生相关调用代码的好工具 C++ 头文件转C# 的好工具
- 托管代码和非托管代码
- .NET 托管、非托管、本地:这些代码有什么区别?