Vb.net 编译成MSIL的代码的大小是否一定与代码速度相关?
我一直在用VisualBasic处理不同类型的本机代码操作,然后用Reflector检查代码,看看产生了什么样的MSIL。例如,我想知道,在一行If-Then-Else中,If-Then-Else与If-Then-Else不同,可以拆分为多行,即Vb.net 编译成MSIL的代码的大小是否一定与代码速度相关?,vb.net,performance,cil,Vb.net,Performance,Cil,我一直在用VisualBasic处理不同类型的本机代码操作,然后用Reflector检查代码,看看产生了什么样的MSIL。例如,我想知道,在一行If-Then-Else中,If-Then-Else与If-Then-Else不同,可以拆分为多行,即 If x > y Then x Else y vs 结果表明,这两个文件编译为同一个MSIL。然后我想知道新的If操作符,类似于旧的IIf函数。需要注意的是,IIf确实是一个函数,因此会产生函数调用的开销,因此虽然它看起来很简洁,但也有其缺点。
If x > y Then x Else y
vs
结果表明,这两个文件编译为同一个MSIL。然后我想知道新的If操作符,类似于旧的IIf函数。需要注意的是,IIf确实是一个函数,因此会产生函数调用的开销,因此虽然它看起来很简洁,但也有其缺点。此外,它在返回值之前对TruePart和FalsePart进行求值,即不短路,因此可能会出现意外行为。因此,我将继续使用If操作符
事实证明,当你对相同的功能使用If操作符时,就像这样
If(x > y, x, y)
产生的MSIL更小,似乎更有效。这就引出了这个主题中的问题
编译成MSIL的代码的大小是否一定与代码速度相关?在一个非常简单的级别上,执行更多的指令所需的时间将比执行更少的指令所需的时间更长,但您不能仅仅说编译代码的大小与速度相关 对于初学者来说,MSIL不是直接在机器上运行的,而是在运行时将JIT编译为实际的机器代码,并在过程中进行进一步优化 此外,代码的性质也会有所不同——执行简单算术运算的长代码可能比具有大量分支的短代码运行得更快,这仅仅是因为处理器可能会错误预测分支,从而导致管道暂停和程序变慢
要真正确定一位代码是否比另一位代码快,唯一的方法是在适当的目标环境中运行它并对其进行分析。在一个非常简单的级别上,执行更多的指令所需的时间比执行更少的指令所需的时间要长,但不能只说编译代码的大小与速度相关 对于初学者来说,MSIL不是直接在机器上运行的,而是在运行时将JIT编译为实际的机器代码,并在过程中进行进一步优化 此外,代码的性质也会有所不同——执行简单算术运算的长代码可能比具有大量分支的短代码运行得更快,这仅仅是因为处理器可能会错误预测分支,从而导致管道暂停和程序变慢
要真正确定一位代码是否比另一位代码快,唯一的方法是在适当的目标环境中运行它并对其进行分析。至于原始执行时间(不包括加载和JIT编译代码的开销),没有相关性 循环是可执行很长时间的紧凑代码的主要示例。你可以写一个很短的一行永远不会终止:
void VerySmallAndNeverTerminates() { for (;;); }
您还可以编写复杂的代码,只要编译器允许(一旦JIT编译器使用它)几乎立即返回。您只需比编译器更聪明:
void VeryBigAndFast(int n) {
if (Math.Abs(n) < 0) {
// Write lots of code here. What doesn't matter,
// since it will never be executed. The compiler
// probably isn't smart enough to know that.
}
}
void VeryBigAndFast(int n){
if(数学绝对值(n)<0){
//在这里写很多代码什么都不重要,
//因为它永远不会被执行。编译器
//也许他不够聪明,不知道这一点。
}
}
因此,时间越长并不一定意味着速度越慢,尽管即时编译器编译代码可能需要更长的时间,如果代码不在内存中,加载代码可能需要更长的时间
判断两个备选方案中哪一个更快的唯一方法是测量。大多数情况下,这其实并不重要。至于原始执行时间(不包括加载和JIT编译代码的开销),两者之间没有相关性 循环是可执行很长时间的紧凑代码的主要示例。你可以写一个很短的一行永远不会终止:
void VerySmallAndNeverTerminates() { for (;;); }
您还可以编写复杂的代码,只要编译器允许(一旦JIT编译器使用它)几乎立即返回。您只需比编译器更聪明:
void VeryBigAndFast(int n) {
if (Math.Abs(n) < 0) {
// Write lots of code here. What doesn't matter,
// since it will never be executed. The compiler
// probably isn't smart enough to know that.
}
}
void VeryBigAndFast(int n){
if(数学绝对值(n)<0){
//在这里写很多代码什么都不重要,
//因为它永远不会被执行。编译器
//也许他不够聪明,不知道这一点。
}
}
因此,时间越长并不一定意味着速度越慢,尽管即时编译器编译代码可能需要更长的时间,如果代码不在内存中,加载代码可能需要更长的时间
判断两个备选方案中哪一个更快的唯一方法是测量。大多数时候,这其实并不重要。不。一个典型的反例是循环展开,它以大小为代价获得速度。不。一个典型的反例是循环展开,它以大小为代价获得速度