汇编语言对于软g工程人员来说Q是高速精的Uͼ但同时也是晦涩难懂的代名词。学校的老师Q各U各L书籍宝典QL丑և各种各样的例子来向我们灌输着q样一个定律:C++~译后生的代码在执行效率上不如汇编~译成机器代码。但是汇~代码在~写的时候晦涩难懂,使得开发效率大为降低。但是在那个CPU寄存器非常珍贵,内存异样E的时代Q汇~相对C有着独特的优势,可以极其_的ؓ每一个变量分配寄存器和内存,但是同时也得开发过E缓慢无比,因ؓ一不留就会造成寄存器分配冲H。同时由于那个时代的C++的编译器的编译效率不高,造成了编译的时候生的代码无论在算法和体积上都无法和汇~相比?br />
最q在~写引擎的时候,一直在汇编的执行效率和C++的编写效率上犹U不觉。一开始试着~写?个不同版本的Vectorc,叉积分别使用SSE汇编和C++优化。然后我试着~译了这两个不同的版本,~译的时候将所有优化选项全部打开Qƈ最大化速度优先。测试程序对于每个版本调?亿次叉积q算Qdq行?0ơ,最后的出的l果令h瞠目l舌。SSE汇编10ơ测试全部|于C++QC++所用的旉只相当于SSE的三分之一?br />
今天新编了一个四元数c,同样在从四元数向矩阵的{换中Q用了Intel|站上的Id Software的汇~代码,和C++代码。同栯行速度最大化优化Q?亿次转换试Q结果在预测之内Q差别虽然没有向量测试的那么惊hQ但C++仍然比汇~高效?br />
C代编译器都支持在~译时打开SSE增强指o集,q意味着Q包括Visual Studio在内的C++~译器,能够在从C/C++到汇~代码的q程中,自动可能的使用SSE增强指o集来提高汇编代码效率。手写SSE汇编Q由于h员之间的水^差异Q不可能汇~代码优化到最高水准,而编译器使用了高效的法来优化生的汇编代码Q这使得Q一个资质普通的E序员写出的SSE代码Q会比由C++~译器编译出的汇~代码要慢的多。当然这个世界上L有着惊h天赋的天才,一定能够在同等条g下写出比~译器快得多的汇~代码,但是q不h普遍性,在Y件业高速发展的今天Q通用性,易用性,Ҏ比,以及重用性才是Y件工E中最重要的,而花大钱雇一个汇~高手来写核心意味着q个代码h最差的UL性,最差的可读性,以及最差的重用性,q是不可取的?/p>
我们应该怿C~译器能够在最短时间内~译出最优代码,而事实上Q这个也已经成ؓ了既定的现实。抛弃手动的SSE汇编Q让~译器来完成q项工作Q是最明智的做法。当然我们应该在~写C++代码时稍微考虑一下数据流的生成顺序,以便让编译器发挥出最大效能,至于如何优化数据,在下一中介绍?/p>
ps: 在Visual Studio.NET 2003下,“启用增强指令集”设|ؓSSE/SSE2卛_?/p>