基于xor方式交换内存变量内容的研究



/*xor swap确实最消耗时间*/
a     ^= b;
b     ^=a;
a     ^= b;

/*多申请内存时间最快*/   
temp  = b;
b     = a;
a     = temp;

/*加减运算swap时间接近于申请内存,但稍高于基于内存交换的机制*/      
a    += b;
b    = a - b;
a    = a - b;
    
由于在2016年下半年这段时间,经常思及机器的运转效率以及机器架构一些问题,包括手机系统。近期借助闲暇,个人很有兴趣地研究了下用xor方式可以在不多申请一块内存的情况下交换两个内存变量的内容的算法。以前总想着这种基于xor进行交换的算法操作是很优美的,理所应当也应该是效率蛮高的。但后来在网上查阅了下关于xor交换变量的效率分析网文,发现现实还是很骨感的。在网上搜索分析的过程中,触及到有篇博文基于汇编指令长度的视角,分析xor_swap的性能文章。虽然这篇文章分析的基石有所偏颇,但分析结果却是对的。对此算法执行效率差异比较大的事实大吃了一惊,便进行了马后炮式的原因分析,也由此又一次深刻更是是深入理解了计算机系统:)
如果以x86架构的cpu来进行验证的话,用xor方式进行交换变量应该是最慢的;占据首位的、最快的,竟然是在内在模型上,也最接近图灵机运转机制的多申请一个内存变量以进行交换的算法;榜眼为add/sub方式。在机理上,基于xor机制和基于add/sub机制以及多一块内存交换机制三种算法策略,在内存读写上是一样。虽然从基于xor方式和add/sub方式的反汇编代码,在汇编层次上来看,差别并不大,但却实际上却执行相差很远很远。由此,不得不怀疑 x86架构的cpu电路层面对于xor的操作支持并不够友好,xor指令需要耗费更多于add/sub的cpu周期才能完成操作。而基于add/sub方式的运转效率,几乎与多申请一块内存的交换算法相当。虽然自己以前就知道基于寄存器的算法是最快的理论知识,但还是惊讶于这次的实际事实,太太接近了!基于add/sub机制多出来的add/sub运算以及寄存器存取操作,在实际执行上却几乎不耗费什么时间。不得不惊叹于纯粹的寄存器运算的快速,以及cpu工作效率与内存工作效率上的巨大差距。

总结下来几个精华来自于 :1、寄存器算法  2、图灵机 3、cpu指令执行周期差异

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章