2012-03-10 111 views
0

这里是我的C代码..优化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)") 

这是对付这种类型的输入参数的好方法?这是否耗时?

是否有任何其他好方法(优化方式)读取相同的输入参数?

+2

为什么你认为你必须优化它? – 2012-03-10 12:23:39

+0

只是想知道2如果这是阅读这种输入或其他更好的方式的唯一方法 – Jay 2012-03-10 12:25:48

+0

不成熟的优化是所有邪恶的根源。顺便说一句,您可能会让代码更具可读性,而不会损失性能,例如,通过将'string1 = strchr(string1,')')+ 2'移出for循环。 – 2012-03-10 12:43:40

回答

0

该代码速度相当快。但是它需要多快才能取决于你不知道的约束。

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

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

但是考虑到你已经发布的'API',速度的问题可能会在高于和低于这段代码片段中被击败。

达到最佳代码链则取决于......所有链:整体不会比链中最慢的功能运行得更快。

对不起,不是更具体,但这是一个更全球性的问题比你提供的信息让我解决它(我没有全部图片)。

1

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

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

#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; 
}