【问题标题】:Optimising C code优化 C 代码
【发布时间】:2012-03-10 12:20:26
【问题描述】:

这是我的 C 代码..

void Read(int t,char* string1)
{
    int j,i,p,row,count=0;
    for(i=0;i<t;++i,string1=strchr(string1,')')+2)
    {
        sscanf(string1,"(%d,%d)",&p,&row);
        CallFunction(p,row);
    }
}

这是我必须如何调用这个函数:

Read(2,"(3,5),(7,8)")

这是处理此类输入参数的好方法吗?很费时间吗?

还有其他读取相同输入参数的好方法(优化方法)吗?

【问题讨论】:

  • 为什么你认为你必须优化它?
  • 只是想知道这是读取此类输入的唯一方法还是其他更好的方法
  • 过早的优化是万恶之源。顺便说一句,您可以使这段代码更具可读性,而不会损失性能,例如,将string1=strchr(string1,')')+2 移出for 循环。

标签: c optimization


【解决方案1】:

您可以为 sscanf() 使用 %n 格式说明符,它允许您省略 strchr() 函数。速度提升可能微乎其微。

顺便说一句:不要调用函数“Read”,即使您可以假设一个区分大小写的编译器和链接器。

#include <stdio.h>

#define CallFunction(a,b) fprintf(stderr, "p=%d row=%d\n", a, b)

void do_read(int cnt,char *input)
{
    int i,err,p,row,res;

    for(i=0; i<cnt ; i++,input += res )
    {
        err = sscanf(input,"(%d,%d)%n",&p,&row, &res);
        if (err < 2) {
                fprintf(stderr, "%s:%d: input='%s', err=%d\n"
                        , __FILE__ , __LINE__,  input, err );
                break;
                }
        CallFunction(p,row);
        if (input[res] == ',') res++;
    }
}

int main(void)
{
do_read(2,"(3,5),(7,8)"); /* this should succeed */
do_read(2,"(3,5)#(7,8)"); /* this must fail ... */

return 0;
}

【讨论】:

    【解决方案2】:

    这段代码相当快。但它需要多快取决于我不知道的约束。

    我希望您的输入数据已经过检查,因为string1=strchr(string1,')')+2(以及后面的内容)不安全。

    阅读您的代码让我觉得,如果您真的需要裸机速度,您应该放弃函数调用并手动完成工作(自己解析字符串)。

    但是鉴于您发布的“API”,速度问题可能会在此代码 sn-p 的上方和下方解决。

    然后达到最优代码链取决于...所有链:整体不会比链中最慢的函数运行得更快。

    很抱歉没有更具体,但这确实是一个比您提供的信息让我能够解决的更全球性的问题(我没有完整的图片)。

    【讨论】:

      猜你喜欢
      • 2012-11-13
      • 1970-01-01
      • 2013-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      相关资源
      最近更新 更多