过度优化代码会以失去高效率为代价得不偿失!
忘记在哪里看到了一个交换两个数值的方法,是采用抑或的方法
即:
a = a ^ b;
b = a ^ b;
a = a ^ b;
这样就交换了两个数值型变量的值,
原理是一个数与任意一个给定的值连续异或两次,值不变。
即:a^b^b=a。
接着还有简化代码:
a^=b;
b^=a;
a^=b;
当然还有更简化的:a^=b^=a^=b;
但是我们看一下编译器对这些语句做了什么:
首先是
a = a ^ b;
b = a ^ b;
a = a ^ b;
a = a ^ b;
00000048 mov eax,dword ptr [ebp-44h]
0000004b xor dword ptr [ebp-40h],eax
b = a ^ b;
0000004e mov eax,dword ptr [ebp-40h]
00000051 xor dword ptr [ebp-44h],eax
a = a ^ b;
00000054 mov eax,dword ptr [ebp-44h]
00000057 xor dword ptr [ebp-40h],eax
再次是
a^=b;
b^=a;
a^=b;
a ^= b;
0000005a mov eax,dword ptr [ebp-44h]
0000005d xor dword ptr [ebp-40h],eax
b ^= a;
00000060 mov eax,dword ptr [ebp-40h]
00000063 xor dword ptr [ebp-44h],eax
a ^= b;
00000066 mov eax,dword ptr [ebp-44h]
00000069 xor dword ptr [ebp-40h],eax
最后是
a^=b^=a^=b;
a ^= b ^= a ^= b;
0000006c mov eax,dword ptr [ebp-40h]
0000006f mov dword ptr [ebp-48h],eax
00000072 mov eax,dword ptr [ebp-44h]
00000075 xor dword ptr [ebp-40h],eax
00000078 mov eax,dword ptr [ebp-40h]
0000007b xor dword ptr [ebp-44h],eax
0000007e mov eax,dword ptr [ebp-48h]
00000081 xor eax,dword ptr [ebp-44h]
00000084 mov dword ptr [ebp-40h],eax
我们可以看到前两种的效率是一样的,但是最后精简的一条语句;就多了三个mov操作。剩下的不用再说了。
最重要的一点:这个交换值的方法是效率最低的,这不知道是谁想到的小技巧很强,但是登不了大雅之堂。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
最近有点几乎疯狂,在优化代码和框架,让自己很累,
重写了很多代码,规避了很多浪费性能的方法,属性,和流程。
然后在容器启动的时候由原来的几十秒近乎疯狂的达到了1点几秒,
但是项目在运行的时候似乎也没有实质性的飞跃。
昨天睡前随手翻阅的大师的书,大师一句话似乎点醒了我。
1.不要优化代码。
2.(专家)永远不要优化代码。
这句话应该有个前提,那就是你的代码不是十分的糟糕,
在一个就是你没有绝对的把握就不要优化代码。
我们尽量使用底层的代码库,甚至在我们搭建底层代码的时候选用较好的框架和逻辑就已经吧性能考虑进去,
在代码的上层应该尽量保证代码的可读性而不是以为的精简和优化。
这是我这几天的感悟。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------