【问题标题】:c program to decrement a large number with minimum execution time [closed]c程序以最小的执行时间递减一个大数字[关闭]
【发布时间】:2015-07-13 15:33:37
【问题描述】:
#include <stdio.h>
#include <time.h>
unsigned int decrement(unsigned int value);
main()
{
    clock_t start, end;
    double cpu_time_used;
    register unsigned int value;
    value = 4294967;
    start = clock();
    decrement(value);
    end = clock();
    cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
    printf("cpu_time_used %lf\n",cpu_time_used);
}

unsigned int decrement(register unsigned int value)
{
    int i;
    for(;value;value--)
    {
        printf("loop value %u\n",value);
    }
    return 0;
}

我试图以更少的执行时间减少一个大整数值,以实现我使用 register 关键字声明一个变量,如 register unsigned int value 从此我没有收到任何优化结果,而使用/不使用此注册关键字运行此程序。如果我错了,请纠正我。 如果我们有任何其他方法可以在最短的执行时间内减少更大的数字,请分享。

这里提到的程序只是以寄存器关键字为例(减少执行时间的优化方法之一)这个问题的主要议程是如何以最短的执行时间递减一个更大的数字。

【问题讨论】:

  • register 修饰符只是一个建议,现在的编译器很少关心。
  • 我不明白你要做什么,或者大量的相关性。你递减i 那么还需要递减value 吗?为什么你有一个循环运行i&gt;=0,但在i==0 时导致break,在每次迭代中浪费执行时间?
  • value = value--; 完全没有意义(只需使用--value;)。并在您的循环中丢失printf,其中一次执行可能比整个循环更耗时(即您的测量几乎是所有 IO时间)。 i==0 的测试也毫无价值。如果修改为 i&gt;0,您已经在 for 循环条件中涵盖了这一点。
  • i=value;value &gt; INT_MAX 时以大值失败。考虑使用一致的类型。
  • 不要在问题中编辑您的代码。如果问题已解决,请接受答案或对您的问题发表评论。

标签: c gcc


【解决方案1】:

没有理解逻辑告诉我decrement(x) 应该始终为零,还有另一个问题: value = value--; 正在调用未定义的行为,因为 value-- 是具有副作用的后减量操作。您想要value--;value -=1。但不是两者兼而有之。

【讨论】:

    【解决方案2】:

    当您调用decrement 函数时,value 正在按值传递。这意味着您在decrement 函数中修改的value 不是与register 关联的关键字。您将需要在定义 register 变量的同一函数中递减。

    即便如此,我仍然怀疑这是否是您真正需要做的事情。对我来说,这似乎是一个过早优化的经典案例。

    【讨论】:

      【解决方案3】:

      register 通常被编译器忽略...无论如何,如果某些东西应该被限定为register,它是decrement 函数的变量value,而不是mainvalue。如果你想加速,为什么要在for 循环中插入if?您可以将代码重写为:

      unsigned int decrement(register unsigned int value)
      {
          for(;value;value--)
          {
              printf("loop value %u\n",value);
          }
          return 0;
      }
      

      编写稍微好一点的代码,让编译器优化……

      【讨论】:

        【解决方案4】:

        我会像这样修改递减函数:

        unsigned int decrement(unsigned int value)
        {
            for(value; value > 0; value--)
            {
               printf("loop value %u\n",value);
            }
            return value;
        

        }

        当你需要 i >= 0 时,你不需要说 i >= 0(当 i == 0 时,请查看 if 和 break ),你甚至不需要“i”,只需使用变量值,因为这是你想要返回的(这就是我从你的代码中理解的)对不起我的英语不好!

        【讨论】:

          【解决方案5】:

          抱歉我的格式,因为我是新来的。 请将 value = value-- 更改为 --value 除非您以明确的方式/语句使用它,否则后增量运算符通常比前增量运算符慢。减量也是如此。 此外,您不需要对i&gt;=0 进行显式检查 试试这个:

          unsigned int decrement(register unsigned int value)
          {
              while(value>=0)
                 printf("loop value %u\n",value--);
              return 0;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-01-16
            • 2016-02-12
            • 2022-12-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-08
            • 2012-08-23
            相关资源
            最近更新 更多