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