C 这两种功能是否相同,工作2的改进时间是否超过工作1?

C 这两种功能是否相同,工作2的改进时间是否超过工作1?,c,algorithm,performance,function,time-complexity,C,Algorithm,Performance,Function,Time Complexity,考虑这两个函数以及关于它们的两个语句S1和S2 int work1(int *a, int i, int j) { int x = a[i+2]; a[j] = x+1; return a[i+2] - 3; } S1:从work1到work2的转换形式有效,即对于任何程序状态和输入参数,work2将计算相同的输出,并对程序状态产生与work1相同的影响 S2:与work1相比,应用于work1以获得work2的所有转换将始终提高work2的性能(即减少CPU时间)

考虑这两个函数以及关于它们的两个语句S1和S2

int work1(int *a, int i, int j)
{
    int x = a[i+2];
    a[j] = x+1;
    return a[i+2] - 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)是正确的(
    例如Google.com

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

    另一种解释说选项(3)是正确的,因为在工作2中只添加了一个额外的变量t1,而不是像工作1那样直接计算下标。输出将是相同的。S1是真的。 无论如何,变量t1和t2的添加都不会提高性能。i、 es2是假的


    你能澄清一下吗?这两种功能是否相同,工作2的改进时间是否超过工作1

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

    宾果。他们都是假的

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

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


    更不愚蠢的是,
    work2
    可能比
    work1
    使用更多的寄存器,这可能会导致调用者的性能更差。或者,在函数调用时保存和恢复这些寄存器的成本可能会影响性能。也许
    work2
    只需要多一点代码缓存,就可以将调用方推到性能悬崖上。也许
    work2
    会短几个字节,而且运气不好会造成巨大的缓存对齐损失。谁知道呢?

    对我来说,就像你说的,S1是假的(看看当j==i+2时会发生什么)。S2不可能适用于所有现有的编译器和体系结构(尽管对于某些编译器和体系结构,我可以相信速度实际上可能更高),因此它也是错误的。CPU时间很难推理:缓存等方面将产生重要影响。此外,CPU时间肯定取决于上下文(目前可用的寄存器数量等).更重要的是,鉴于S1为false(函数不做相同的操作),S2没有意义。您无法明智地比较两个执行不同操作的函数的性能。如果不指定CPU,则无法比较CPU时间。CPU将在运行时检测并解决
    a[j]
    a[i+2]
    的任何别名,但所需时间在很大程度上取决于CPU的确切型号。1)没有程序,只有两个函数。2)这是C还是C++?3) 所以不是“做我的家庭作业”网站。谢谢你的解释。
    int work2(int *a, int i, int j)
    {
        int t1 = i+2;
        int t2 = a[t1];
        a[j] = t2+1;
        return t2 - 3;
    }