计算机 CPU 逻辑运算 关系运算 赋值运算 算术运算 速度效率性能比较

https://bbs.csdn.net/topics/390646023

A:逻辑运算

and or not xor等等,有专用电路直接实现,也就是所谓的逻辑门电路,而且结构简单,比数字比较器、桶形移位器要简单,通常情况下速度更快一些。


C:关系运算

> < = >= <= <>等等,也有专用电路(数字比较器)可以实现,运算速度也是比较快的。


D:赋值运算

不管什么架构的处理器肯定都有这种指令,而且是使用频繁的指令,经过高度优化的,速度也是相当快的(在超标量架构下其等效时钟周期可以小于1)。


B:算术运算

种类太多,+ - << >>运算速度很快,接近逻辑和关系运算,但是* /慢很多,尤其是除法指令。如果涉及到浮点运算,就更慢了。
所以综合来说,运算速度A≈C≧D≧B(实际上在传统计算机中,应该是A≧C≧D≧B,不过在较新的架构中,比如intel core架构,比较+分支优化得很厉害,基本和逻辑运算相当)

但是只能说理论上如此,具体到实际指令,情况还很复杂,操作数使用寄存器、内存、立即数还有分别,即便同样的操作,比如mov,mov r,r/i就比mov r,m快,而mov r,m比mov m,r快。
就我所知,在目前的intel架构中,最快的指令是xor eax,eax这类指令(注意不是普通的xor,而是源操作数和目的操作数使用同一寄存器,清0操作),延迟只有1个时钟周期,吞吐量达到4(意味着最多可以并行4条这种指令),要快于mov eax,0。

 

基本同意DelphiGuy,除了有一点补充:
赋值运算,如果算是写到内存的话,那肯定是最慢的,powewrpc上100多周期。
如果算写入cache,前几年的powerpc是3个周期,最近是1个周期。

但是无论哪种,都不太可能小于1。如果算超标量,就算每个周期抓取多条写指令,至少我所看到的cpu里面的load/sotre单元个数,总是小于取指令单元个数的。所以如果全是store指令,一段时间以后,流水线会塞满。这样,哪怕全都命中cache,写操作的平均时间就和单个写一样。

欢迎讨论。

 

赋值运算看起来是最快的,但是要考虑到给谁赋值,如果是给寄存器,肯定是最快的,但如果是内存,就需要多次读取存储器来定位地址,比如访问页表,而且主存离cpu很远,很可能需要安排多次时钟周期才能完成赋值。算数运算肯定大于逻辑运算和关系运算,特别是如果涉及浮点运算,还需要专门的协处理器来完成。从硬件的角度看,逻辑运算和关系运算的电路实现应该是类似的。

 

https://bbs.csdn.net/topics/390646023

 

 

 

 

 

 

 

加减乘除及位运算的快慢程度

2018年08月13日 21:17:02 lilamei170607 阅读数:518

 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lilamei170607/article/details/81636916

public class demo{
   
    public void funAdd() {
        long i1=System.currentTimeMillis();
        int sum=0;
         for(int i=0;i<1000000000;i++) {
            sum+=i; 
         }
         System.out.println(System.currentTimeMillis()-i1);
    }

    public void funMuplate() {
        long i1=System.currentTimeMillis();
        int sum=1;
         for(int i=1;i<1000000001;i++) {
            sum*=i; 
         }
         System.out.println(System.currentTimeMillis()-i1);
    }
    
    public void funMuplate1() {
        long i1=System.currentTimeMillis();
        int sum=512;
        for(long i=0;i<1000000000;i++) {
             sum=sum<<2;
             }
         System.out.println(System.currentTimeMillis()-i1);
    }

    public void funMuplate2() {
        long i1=System.currentTimeMillis();
        int sum=512;
        for(long i=0;i<1000000000;i++) {
         sum=sum*4;
         }
         System.out.println(System.currentTimeMillis()-i1);
    }
    
    public static void main(String []args) {
       new demo().funAdd();
       new demo().funMuplate();
       new demo().funMuplate1();
       new demo().funMuplate2();
   }

}

 

结果:

结果证明:T

加(减)所用时间<乘(除)所用时间

位运算所用时间<乘(除)所用时间(一般情况下)

原因如下:

【加法】:

指令             指令周期

adc 寄存器, 立即数      1

adc 寄存器, 寄存器      1

adc 寄存器, 内存       2

adc 内存,   立即数      3

adc 内存,   寄存器      3

 

add 寄存器, 立即数      1

add 寄存器, 寄存器      1

add 寄存器, 内存       2

add 内存, 立即数       3

add 内存, 寄存器       3

 

inc 寄存器          1

inc 内存           3

 

【减法】:

dec 寄存器          1

dec 内存           3

 

sub 寄存器, 立即数      1

sub 寄存器, 寄存器      1

sub 寄存器, 内存       2

sub 内存, 立即数       3

sub 内存, 寄存器       3

 

sbb 寄存器, 立即数      1

sbb 寄存器, 寄存器      1

sbb 寄存器, 内存       2

sbb 内存, 立即数       3

sbb 内存, 寄存器       3

 

【乘法】:

imul 寄存器         11

imul 内存          11

imul 寄存器, 寄存器, 立即数 10

imul 寄存器, 立即数     10

imul 寄存器, 内存, 立即数  10

imul 寄存器, 寄存器     10

imul 寄存器, 内存      10

 

mul 8位寄存器        11

mul 16位寄存器        11

mul 32位寄存器        10

mul 8位内存         11

mul 16位内存         11

mul 32位内存         10

 

【除法】:

div 8位寄存器        17

div 16位寄存器        25

div 32位寄存器        41

div 8位内存         17

div 16位内存         25

div 32位内存         41

 

idiv 8位寄存器        22

idiv 16位寄存器       30

idiv 32位寄存器       46

idiv 8位内存         30

idiv 16位内存        30

idiv 32位内存        46

由此可见,CPU计算加减法的速度跟位运算(与、或、非、异或)相当,乘法的速度比加减法慢近10倍,除法的速度比加减法慢(近20倍——8位,近30倍——16位,40倍以上——32位)。算加减法,读取内存数据的比不读内存数据的慢,写内存的比读内存的慢。

https://blog.csdn.net/lilamei170607/article/details/81636916

你可能感兴趣的:(计算机基础)