在c#或java里面,咱们一般会这样写for循环:java
for(int i = 0;i<10;i++) { Console.WriteLine(i); }
前一阵子,我突发奇想,若是按照下面这样写,会不会比上面的运行效率高一些:程序员
int i = 0; for(; i<10 ;i++) { Console.WriteLine(i); }
由于我以为最上面的那种方式,每次循环都会声明一个变量,说不定会影响效率,因而百度了一下,发现其余人也有这个疑惑,特地百度了一些资料,在此作个综合。编程
首先是在内层循环中定义变量到底会不会存在重复分配的问题,这涉及到编译器的优化,不过主流编译器(如vs和gcc)这一块优化都比较好,不会反复分配变量。函数的定义是编译器的事情,运行的时候不存在什么定义,更没有什么开销。c#
除非是类对象或者结构体对象, 在for循环里面与外面, 开销可能会不同.基本数据类型, 那是同样的, 编译器确定会优化这个东西。markdown
通常来讲, 在进入函数时, 全部的栈变量都分配好空间了. 因此那个for变量写在哪里都是同样的. 具体你能够看一下反汇编代码, 所有就展示在你眼前了,我查看过C#的IL代码,发现两种写法的IL代码是同样的,说明没有区别。函数
栈中的空间在编译这个代码的时候大小就肯定下来了,运行这个方法时空间就已经分配好了,不要想固然的觉得声明一次就要分配一次空间,那是c语言,java能够重用这些超出做用域的空间。只要用javap查看方法字节码,看看使用的局部变量表的大小和使用方式即知java这种基于虚拟机的语言,是跟单纯的C不一样,C语言的原则是相信程序员能作好一切,所以它不会帮你作多少事情,须要考虑代码优化,内存占用等。优化
不过,本身在编程的时候要注意不要让上一次的结果影响到下一次循环,好比上一次 a = 3, 当下一次循环在给a赋值的时候出了错误,而你捕获了错误,却没修正a的值,程序继续执行,那么这时候a=3还成立,可能就会有问题了,若是是每次都从新定义,那就不存在这样的问题。spa
最后总结:code
for
循环的赋值语句、判断语句中,都要避免重复建立对象。