在我正在使用的一个C应用程序中,在ctype.h的函数下面:
isalpha(),isspace(),ispunct(),tolower()。
在分析之后,我发现这些函数的调用存在一些瓶颈(基本上我的应用程序是从输入文本文件处理的字符/字符串,因此这些函数在关键循环中被详尽地称为)我想优化它们以获得速度如果它有帮助,我会有自己的实现。
我在哪里可以找到这样或逻辑来实现它们?
答案 0 :(得分:4)
您可以将它们实现为宏或内联函数:
#define IS_ALPHA(x) (((x) >= 'a' && (x) <= 'z') || ((x) >= 'A' && (x) <= 'Z'))
#define IS_SPACE(x) ((x) == ' ' || (x) == '\t')
... etc.
但请注意,原始isalpha
,isspace
,ispunct
等取决于当前的区域设置,并且可能会根据语言产生不同的结果。
答案 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()
,因为它们必须不是真的)。