Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 什么是;计算操作数取决于函数的实现方式;实际上是什么意思?_Performance - Fatal编程技术网

Performance 什么是;计算操作数取决于函数的实现方式;实际上是什么意思?

Performance 什么是;计算操作数取决于函数的实现方式;实际上是什么意思?,performance,Performance,我一直在研究算法效率,一门课程的一部分说,计算运算次数(而不是对算法计时)取决于函数的实现方式(写为下边),也取决于算法(写为上边) 这到底意味着什么?如果两段代码是同一算法的两个不同实现,这意味着什么(我在这里遗漏了一些微妙之处,还是仅仅意味着两个做相同事情但语法略有不同的函数算作同一算法的两个独立实现)?它依赖于算法的事实是好的,但依赖于实现的事实是坏的,这一事实如何呢?无法解释课程作者的意思,但也许我可以澄清你的第二个问题 算法是对实现特定目标/计算所需操作的描述。这是最常用的数学语言。计

我一直在研究算法效率,一门课程的一部分说,计算运算次数(而不是对算法计时)取决于函数的实现方式(写为下边),也取决于算法(写为上边)


这到底意味着什么?如果两段代码是同一算法的两个不同实现,这意味着什么(我在这里遗漏了一些微妙之处,还是仅仅意味着两个做相同事情但语法略有不同的函数算作同一算法的两个独立实现)?它依赖于算法的事实是好的,但依赖于实现的事实是坏的,这一事实如何呢?

无法解释课程作者的意思,但也许我可以澄清你的第二个问题

算法是对实现特定目标/计算所需操作的描述。这是最常用的数学语言。计算机程序是实现算法[1]的一种方法,也是最常见的方法。即使它们是相当抽象的东西,它们仍然比数学描述更具体。它们与编写它们的编程语言和环境有关,其中包括各种怪癖、您试图解决的问题的细节[2],甚至是编写它的特定工程师。因此,实现某种算法的两个程序或程序的一部分是不同的,甚至具有不同的性能,这是很自然的。因此,为某个输入执行的指令数量肯定会落在两个实现之间不同的属性桶中


[1] 另一种方式可能是硬件,如数字电路或模拟计算机,或通过某些机械过程,如时钟或19世纪的机械自动机,甚至是某些生物或化学过程。
[2] 澄清一下,通用排序例程的编写方式可能与16位整数排序例程不同,即使它们都实现了快速排序。

无法解释课程作者的意思,但也许我可以澄清您的第二个问题

算法是对实现特定目标/计算所需操作的描述。这是最常用的数学语言。计算机程序是实现算法[1]的一种方法,也是最常见的方法。即使它们是相当抽象的东西,它们仍然比数学描述更具体。它们与编写它们的编程语言和环境有关,其中包括各种怪癖、您试图解决的问题的细节[2],甚至是编写它的特定工程师。因此,实现某种算法的两个程序或程序的一部分是不同的,甚至具有不同的性能,这是很自然的。因此,为某个输入执行的指令数量肯定会落在两个实现之间不同的属性桶中


[1] 另一种方式可能是硬件,如数字电路或模拟计算机,或通过某些机械过程,如时钟或19世纪的机械自动机,甚至是某些生物或化学过程。
(2)为了澄清,通用排序例程可能以不同于16位整数排序例程的方式编写,即使它们都实现Quasr排序。

< P>也不正确,事实位于中间。也许30多年前,算法已经不再是什么了,但是今天,编译器可以解构你的算法并以不同的方式重新构建它(如果它已经被编程来识别你正在尝试做什么的话)

数学上:你可能在小学就听过关于把从1到100的所有数字相加,使从0到100更容易,这就是99或100加法运算,是吗?加上一个循环,它是一个计数器和一个比较。如果你意识到0+100=100,99+1=100,98+2=100会怎么样。共有50对,加起来等于100对,然后50对本身就剩下了。所以我们可以减少100个加法,一个循环加上100个加法,然后比较到50*100+50或50*101。一次乘法。你可能会用一些约束来做一个算法,但是把从0到N的所有数字加起来,把N作为约束,N的奇偶值会产生一个不同的通用算法,也许,也许不是,可能有一个N/2,一些乘法,也许还有一个加法。比在循环中进行N次加法要便宜得多,循环变量必须进行多次加法和比较

但关于实施:

00000000 <fun1>:
   0:   e59f0000    ldr r0, [pc]    ; 8 <fun1+0x8>
   4:   e12fff1e    bx  lr
   8:   000013ba            ; <UNDEFINED> instruction: 0x000013ba

0000000c <fun2>:
   c:   e59f0000    ldr r0, [pc]    ; 14 <fun2+0x8>
  10:   e12fff1e    bx  lr
  14:   000013ba            ; <UNDEFINED> instruction: 0x000013ba

00000018 <fun3>:
  18:   e59f0000    ldr r0, [pc]    ; 20 <fun3+0x8>
  1c:   e12fff1e    bx  lr
  20:   d783574e    strle   r5, [r3, lr, asr #14]
00000000:
0:e59f0000 ldr r0,[pc];8.
4:E12FF1E bx lr
8:000013ba;说明:0x000013ba
0000000c:
c:e59f0000 ldr r0,[pc];14
10:E12FF1E bx lr
14:000013ba;说明:0x000013ba
00000018 :
18:e59f0000 ldr r0,[pc];20
1c:E12FF1E bx lr
20:d783574e strle r5[r3,lr,asr#14]
在这种情况下,算法是不相关的,注意编译器甚至将伪随机求和循环减少到了答案中

unsigned int fun1 ( unsigned int x )
{
    return(x*10);
}
unsigned int fun2 ( unsigned int x )
{

    return((x<<3)+(x<<1));
}
unsigned int fun3 ( unsigned int x )
{
    return(((x<<2)+x)<<1);
}
unsigned int fun1(unsigned int x)
{
返回(x*10);
}
无符号整数fun2(无符号整数x)
{

返回((x既不正确,事实也位于中间)。该算法不是任何东西,可能是30年前,但今天编译器可以解构你的算法并以不同的方式重构它(如果它被编程来识别你正在尝试做什么)。 数学上:你可能在小学就听过一个关于把从1到100的所有数字相加,使从0到100更容易,所以这是99或100加法运算
00000000 <fun1>:
   0:   e0800100    add r0, r0, r0, lsl #2
   4:   e1a00080    lsl r0, r0, #1
   8:   e12fff1e    bx  lr

0000000c <fun2>:
   c:   e1a03080    lsl r3, r0, #1
  10:   e0830180    add r0, r3, r0, lsl #3
  14:   e12fff1e    bx  lr

00000018 <fun3>:
  18:   e0800100    add r0, r0, r0, lsl #2
  1c:   e1a00080    lsl r0, r0, #1
  20:   e12fff1e    bx  lr
unsigned int fun1 ( unsigned int x )
{
    unsigned int ra;
    unsigned int rb;
    rb=0;
    for(ra=0;ra<=x;ra++) rb+=ra;
    return(rb);
}

unsigned int fun2 ( unsigned int x )
{
    return((x/2)*(x+1));
}
00000000 <fun1>:
   0:   e3a02000    mov r2, #0
   4:   e1a03002    mov r3, r2
   8:   e0822003    add r2, r2, r3
   c:   e2833001    add r3, r3, #1
  10:   e1500003    cmp r0, r3
  14:   2afffffb    bcs 8 <fun1+0x8>
  18:   e1a00002    mov r0, r2
  1c:   e12fff1e    bx  lr

00000020 <fun2>:
  20:   e1a030a0    lsr r3, r0, #1
  24:   e2802001    add r2, r0, #1
  28:   e0000293    mul r0, r3, r2
  2c:   e12fff1e    bx  lr
unsigned int fun1 ( unsigned int x )
{
    return(x/10);
}

00000000 <fun1>:
   0:   e59f3008    ldr r3, [pc, #8]    ; 10 <fun1+0x10>
   4:   e0821390    umull   r1, r2, r0, r3
   8:   e1a001a2    lsr r0, r2, #3
   c:   e12fff1e    bx  lr
  10:   cccccccd    stclgt  12, cr12, [r12], {205}  ; 0xcd
unsigned int fun1 ( unsigned int x )
{
    return(x*10.0);
}

00000000 <fun1>:
   0:   ee070a90    vmov    s15, r0
   4:   ed9f6b05    vldr    d6, [pc, #20]   ; 20 <fun1+0x20>
   8:   eeb87b67    vcvt.f64.u32    d7, s15
   c:   ee277b06    vmul.f64    d7, d7, d6
  10:   eefc7bc7    vcvt.u32.f64    s15, d7
  14:   ee170a90    vmov    r0, s15
  18:   e12fff1e    bx  lr
  1c:   e1a00000    nop         ; (mov r0, r0)
  20:   00000000    andeq   r0, r0, r0
  24:   40240000    eormi   r0, r4, r0

unsigned int fun1 ( unsigned int x )
{
    return(x*10.0F);
}

00000000 <fun1>:
   0:   ee070a90    vmov    s15, r0
   4:   ed9f7a04    vldr    s14, [pc, #16]  ; 1c <fun1+0x1c>
   8:   eef87a67    vcvt.f32.u32    s15, s15
   c:   ee677a87    vmul.f32    s15, s15, s14
  10:   eefc7ae7    vcvt.u32.f32    s15, s15
  14:   ee170a90    vmov    r0, s15
  18:   e12fff1e    bx  lr
  1c:   41200000            ; <UNDEFINED> instruction: 0x41200000
unsigned int fun1 ( unsigned int x )
{
    return((((x<<1)*20)+1)>>1);
}

00000000 <fun1>:
   0:   e0800100    add r0, r0, r0, lsl #2
   4:   e1a00180    lsl r0, r0, #3
   8:   e1a000a0    lsr r0, r0, #1
   c:   e12fff1e    bx  lr