从ctype.h优化了一些函数的实现

时间:2011-07-18 18:35:48

标签: c optimization func

在我正在使用的一个C应用程序中,在ctype.h的函数下面:

isalpha(),isspace(),ispunct(),tolower()。

在分析之后,我发现这些函数的调用存在一些瓶颈(基本上我的应用程序是从输入文本文件处理的字符/字符串,因此这些函数在关键循环中被详尽地称为)我想优化它们以获得速度如果它有帮助,我会有自己的实现。

我在哪里可以找到这样或逻辑来实现它们?

5 个答案:

答案 0 :(得分:4)

您可以将它们实现为宏或内联函数:

#define IS_ALPHA(x) (((x) >= 'a' && (x) <= 'z') || ((x) >= 'A' && (x) <= 'Z'))
#define IS_SPACE(x) ((x) == ' ' || (x) == '\t')
... etc.

但请注意,原始isalphaisspaceispunct等取决于当前的区域设置,并且可能会根据语言产生不同的结果。

答案 1 :(得分:2)

奇怪的是,这些功能可能是你的瓶颈;可能他们可以考虑到语言环境,这使他们“变慢”。如果你可以忽略它,那么你就可以轻松地实现它们(例如:这只是一个动态写的想法)

bool isalpha(int c)
{
   return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
}

bool isspace(int c)
{
   return c == ' ' || c == '\t'; // || whatever other char you consider space
}

bool ispunct(int c)
{
   static const char *punct = ".;!?...";
   return strchr(punct, c) == NULL ? false : true; // you can make this shorter
}

int tolower(int c)
{
   if ( !isalpha(c) ) return c;
   return (c >= 'A' && c <= 'Z') ? c - 'A' : c;
}

然后使它们成为内联函数。

答案 2 :(得分:2)

您可以使用256个元素的查找表快速实现这些功能。对于isalpha(),如果ASCII值为i的字符是字母数字,则第i个元素为1。然后isalpha只是一个表查找。

通过将每个条目的一位用于一个函数的结果,可以节省一些空间并使用一个表对所有这些函数进行编码。然后每个函数只查找传入的字符的条目,并屏蔽掉它所需的位。

戴夫

答案 3 :(得分:0)

一般来说,编写库代码的人都是非常优秀的软件工程师,这些功能已经调到了第n级。除非您可以删除这些功能必须考虑的一些情况,否则您将难以匹配其性能。

答案 4 :(得分:0)

查看ctype.h标头 - 您的编译器库可能已经提供了一种方法,可以将这些函数内联或实现为宏(如果由于某种原因不支持内联)。 (顺便说一句 - 您使用的是什么编译器和目标平台?)

如果这些内容已经内联/宏,那么您可能希望发布一些有关如何使用这些功能的详细信息。也许有一种快捷方式可以调用其中一些函数(例如,如果isspace()为真,则不需要调用isalpha()ispunct(),因为它们必须不是真的)。