上次我们发现valarray比一般的C循环慢。当时是在release mode下比较的。如果读者在debug mode下面编译执行,你可能会发现valarray的运行速度可能还要降低10倍以上。这是为什么呢?
深入研究valarray的实现,里面也没有任何的调试代码,也不依赖于任何其他的东西,难道就是因为采用了类而导致的这个问题吗?如果这样岂不问题太大了?
在调试模式下设一个端点,然后我们看汇编码,就会发现所有的inline函数都被编译成了函数调用,也就是说inline指令没有起任何作用。
在release mode下干同样的事情,看汇编码,但是不会有原程序的对应。可以先到release mode 的 setting里察看C++选项,加入debugging information (只要不选program data base for edit and continue), release mode的编译和运行都不会有任何影响,同时还可以看到对应的源代码。这时候我们可以清楚地看到inline函数确实被嵌入而不再是函数调用了。
原因就在于此:函数调用的开销在这个程序中极大的影响了性能。因为每一次的函数调用包括了:
参数的拷贝(写入堆栈,从堆栈读取,函数返回时还要从堆栈恢复
环境的保存与恢复,包括寄存器,返回地址等等。
验证这个结论很简单:在debug mode下,加入/Ob1编译选项(这个选项打开了inline功能),强迫编译器把inline函数作为inline处理,此时debugging information也不能选program database for edit and continue, 从而也