【发布时间】:2015-12-02 11:42:22
【问题描述】:
考虑这两个函数以及关于它们的两个语句 S1 和 S2。
int work1(int *a, int i, int j)
{
int x = a[i+2];
a[j] = x+1;
return a[i+2] - 3;
}
int work2(int *a, int i, int j)
{
int t1 = i+2;
int t2 = a[t1];
a[j] = t2+1;
return t2 - 3;
}
S1:work1 到 work2 的转换形式是有效的,即对于任何程序状态和输入参数,work2 将计算相同的输出并对程序状态产生与work1 相同的效果。
S2:与work1 相比,应用于work1 以获得work2 的所有转换将始终提高work2 的性能(即减少CPU 时间)。
- S1 为假,S2 为假
- S1 为假,S2 为真
- S1 为真,S2 为假
- S1 为真,S2 为真
AFAIK:语句 S1 和 s2 都是正确的,因为两个程序是等效的,如果 CPU 使用更多空间,则执行时间应该更少,反之亦然。因此,选项 (4) 为真 (e.g. Google.com)。
但是,在某处给定选项 (1) 为真,因为当 j == i+2 程序将返回不同的结果而 S2 为假时,因为它被赋予了高级语言。但我没有得到这个解释。
另一种解释说选项(3)是正确的,因为在工作 2 中只添加了一个额外的变量 t1,而不是像在工作 1 中那样直接计算下标。输出将是相同的。 S1 是真的。 添加变量 t1 和 t2 无论如何都不会提高性能。即 S2 为假。
你能澄清一下吗?两个功能是否等效,work2 的改进时间是否超过 work1?
【问题讨论】:
-
对我来说,看起来 S1 是假的,就像你说的那样(看看当 j == i + 2 时会发生什么)。 S2 不可能对每个现有的编译器和架构都是正确的(尽管对于某些对,我相信速度实际上可能更高),所以它也是错误的。
-
CPU 时间很难推断:缓存等方面会产生重要影响。
-
另外,CPU 时间肯定取决于上下文(目前可用的寄存器数量等)。
-
更重要的是,鉴于 S1 是假的(功能不一样),S2 没有意义。您无法明智地比较执行不同操作的两个函数的性能。而且你不能在不指定 CPU 的情况下比较 CPU 时间。
a[j]和a[i+2]的任何别名都将在运行时由 CPU 检测并解决,但所需时间很大程度上取决于 CPU 的确切型号。 -
1) 没有程序,只有两个功能。 2)这是C还是C++? 3) SO 不是“做我的功课”网站。
标签: c algorithm performance function time-complexity