这段代码是否尽可能高效?

时间:2017-04-16 22:00:43

标签: c arrays

如果特定长度的数组中的所有元素都为正,我编写了一个返回伪布尔值的函数。我觉得这可能效率低下:

int all_positive(int a[], unsigned int alen)
{
for(int i = 0 ; i < alen ; i++)
    {
        if(a[i] < 0)
            {
                return 0;
                break;
            }
        else if(i == alen - 1)
            {
                return 1;
            }
    }
}

8 个答案:

答案 0 :(得分:2)

你可以清理它并缩短它:

int all_positive(int a[], unsigned int alen)
{
    for(int i = 0 ; i < alen ; i++)
        if(a[i] < 0)
                return 0;
    return 1;
}

我不确定这是否会更快。您的优化器也可以这样做。

答案 1 :(得分:2)

int all_positive(int a[], unsigned int alen)
{
    unsigned i;
    for (i = 0; i < alen && a[i] > 0; ++i)
        ;
    return i == alen;
}

您可以稍微整理一下代码,以减少分支。同时将i++替换为++i,以便不创建临时对象。

答案 2 :(得分:2)

  

如果特定长度的数组中的所有元素都是正数。

(OP&#39的代码暗示0被认为是正面的。)

代码可以<tr style="cursor:pointer;" id="235005" class="showOffre setPushStat ajax" href="menu_detail_offre.php?checksum=IM-O-58cf724c03e64" data-divdest="detail_235005" data-godiv="detail_235005" data-pushstat_url="!O-235005"> <td align="left" style="vertical-align:middle"><img src="/photos.immobilier.nc//gw/2017/4/_thumbs/bb3dfed8-66f6-4a6b-939a-a47b70c998ba.jpeg" width="100"></td> <td nowrap="" align="left" style="vertical-align:middle"> 235005</td> <td align="left" style="vertical-align:middle">Vente</td> <td align="left" style="vertical-align:middle"><img src="http://immobilier.nc/images/part_promobat_mini.jpg" style="display: none !important;"> </td> <td align="left" style="vertical-align:middle">Appartement</td> <td align="left" style="vertical-align:middle">F3</td> <td align="left" style="vertical-align:middle">Nouméa</td> <td align="left" style="vertical-align:middle">Ouémo</td> <td nowrap="" align="left" style="vertical-align:middle">35.278 U</td> <td align="left" style="vertical-align:middle">17/04/2017</td> </tr> 将所有值放在一起。所有代码都在寻找一个符号位。

or

没有退出的早期否定,但是一个简单的循环。

适用于2的补充系统。对于其他稀有平台,这取决于OP如何处理int all_positive1(const int a[], size_t alen) { int y = 0; while (alen--) { y |= a[alen]; } return y >= 0; }

提前退出

-0

经典破解它在一端放置一个已知的否定。当然,int all_positive2(const int a[], size_t alen) { while (alen--) { if (a[alen] < 0) return 0; } return 1; } 不能是int a[]。与@technosaurus

类似
const

答案 3 :(得分:1)

您可以移除else if部分,并在循环之外执行此操作。

If (i == alen) return 1;

或者

return 1;

这样你就可以避免在每个循环中检查条件。除此之外,我没有看到任何其他可能的改进。

修改:此外,您不需要break;,因为您使用return;

答案 4 :(得分:1)

  • 不要返回int。返回bool(自C99开始......现在是2017年!)
  • unsigned int alen vs(signedint i ...不是个好主意!保持一致,并为长度和索引使用 Designed 类型:size_t
  • 整个else if是不必要的。只需在函数末尾的循环外放置return true;即可。这也会使编译器静默警告你“控制到达非空函数的结束”。您确实已启用所有警告,是吗?
  • 你修改了数组的内容吗? ,所以告诉函数的调用者:int const * a(也可以摆脱那些隐藏指针的混淆语法糖)。
  • break是多余的。

那就是说,你正在对那个数组进行一次传递,只看每个元素。有很多关于如何编写这个简单循环的变体,并且所有变体都可能几乎一样快。如果你正在寻找一个性能瓶颈,那么这可能是(*)不是搜索的地方(否则你需要尝试获取SSE或 - 对于大型数组 - 多个线程可以解决这个问题)

我的看法:

bool all_positive(int const * array, size_t length) {
  for (size_t i = 0; i < length; ++i) {
    if (array[i] < 0) {
      return false;
    }
  }
  return true;
}

(*)确保您需要个人资料您的代码。这通常通过使用特殊编译器开关编译代码来完成,这样运行编译的程序就会生成一个配置文件,其中包含程序花费大部分时间的代码。 如果事实证明上面的循环是实际的瓶颈,那么按照评论中的建议尝试去掉它可能是有意义的,只需跟踪该数组中负面元素的数量您插入/修改值。

答案 5 :(得分:0)

由于您没有指定输入arrray必须是const,所以只需在末尾留下填充并执行此操作。

static inline _Bool all_positive(int *a, size_t alen){
    a[alen]=-1;
    size_t i = 0;
    while (a[i]>=0){
        ++i;
    }
    return i!=alen;
}

如果您无法使用填充,则可以保存并恢复最后一项

答案 6 :(得分:0)

可以简化一下。 检查此代码,它将提供相同的输出

int all_positive(int a[], unsigned int alen)
{
  for(int i = 0 ; i < alen ; i++)
  {
        if(a[i] < 0)
                return 0;
  }
  return 1;
}

如果你可以使用bool而不是int那么它会更容易

bool all_positive(int a[], unsigned int alen)
{
  for(int i = 0 ; i < alen ; i++)
  {
        if(a[i] < 0)
                return false;
  }
  return true;
}

答案 7 :(得分:-2)

你的profiler告诉你这里有问题吗?当您从一个元素移动到下一个元素时,可能指针实现可能更快。

第二次检查似乎很奇怪。我可能会像这样重写它。

int all_positive(int a[], unsigned int alen)
{
     if (alen > 0)
     {
         for(int i = 0 ; i < alen - 1 ; i++)
         {
            if (a[i] < 0)
            {
                return 0;
                break;
            }
            else
            {
                /* Since this is positive we can just keep looking */
            }
         }
     }
     else
     {
         /* Empty arrays imply all are positive */
     }

     return 1;
}

还有很多其他事情可以做 我建议您使用分析器来确定程序运行缓慢的位置。这是一项有用的技能。