【问题标题】:Are both functions equivalent or not, and improvement time in work2 over work1 or not?两个功能是否等效,工作 2 的改进时间是否超过工作 1?
【发布时间】: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:work1work2 的转换形式是有效的,即对于任何程序状态和输入参数,work2 将计算相同的输出并对程序状态产生与work1 相同的效果。

S2:与work1 相比,应用于work1 以获得work2 的所有转换将始终提高work2 的性能(即减少CPU 时间)。

  1. S1 为假,S2 为假
  2. S1 为假,S2 为真
  3. S1 为真,S2 为假
  4. 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


【解决方案1】:

但是,在某处给定选项 (1) 为真,因为当 j == i+2 程序将返回不同的结果而 S2 为假时,因为它被赋予了高级语言。但没有得到这个解释。

宾果游戏。他们都是假的。

S1 为假,因为j 可以等于i+2,导致a[j]=x+1 改变a[i+2] - 3 的结果。

S2 是错误的(假设没有我们应该假设的更多上下文),因为无法笼统地推断出对于语义上不同的两位代码,一个必然比另一个快。某些 CPU 的所有操作可能需要四个时钟周期,除了一个需要一个时钟周期并且与int x = a[i+2]; a[j] = x+1; 完全相同的操作。

为了不那么傻,work2 可能使用比work1 更多的寄存器,这可能会导致调用者的性能更差。或者,在函数调用时保存和恢复这些寄存器的成本可能会损害性能。也许work2 会使用更多的代码缓存并将调用者推到性能悬崖上。也许work2 会缩短几个字节,而且运气不好会导致巨大的缓存对齐损失。谁知道?

【讨论】:

  • 感谢您的精彩解释。
猜你喜欢
  • 2015-05-05
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 2016-08-19
  • 2023-04-04
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多