dra*_*raw 9 c optimization performance
例如,<ctype.h>有像这样的功能isalpha().
我想知道isalpha自己编写函数是否比调用更快isalpha?
感谢您的所有即时回复!只是想让我的问题更清楚:
所以即使是isalpha功能?因为你可以简单地传递一个角色并检查角色是否在'a'和'z'||之间 'A'和'Z'?
另一个问题:当你包含像ctype.h这样的std库并只调用一个像isalpha这样的函数时,文件(我的意思是所有代码行)都会加载吗?我担心的是,大尺寸会使程序变慢
Jam*_*lis 65
除非您有特定的理由这样做(例如,您有特定的要求不使用标准库,或者您已经描述了一个非常具体的用例,您可以编写一个性能更好的函数),您应该总是喜欢使用标准库函数,其中存在而不是编写自己的函数.
标准库函数经过大量优化并经过严格测试.此外,编译器附带的标准库可以利用编译器内在函数和您在自己的代码中无法使用的其他低级细节.
Ste*_*non 15
isalpha不只是检查它的参数是否在范围内A-Z,a-z.引用C标准(第7.4.1.2节):
isalpha函数测试isupper或islower为true的任何字符,或者是任何字符集特定的字母字符集之一的字符,其中iscntrl,isdigit,ispunct或isspace都不为真.
很有可能你可以编写一个更有限的版本(如你所建议的),它对于它处理的案例子集更快,但它不是isalpha函数.库程序不仅存在效率,而且完整和正确.效率实际上是最容易的部分; 让所有边缘情况正确是努力工作的地方.
另请注意,如果您要编写一个针对英语/ ASCII的优化版本,您可以使用其他人建议的查找表或我个人的偏好(编辑修复R抓到的错误..)
int isalpha(int c) {
return ((unsigned int)(c | 32) - 97) < 26U;
}
Run Code Online (Sandbox Code Playgroud)
通常,您应该尽可能使用C库.一个真正的原因不是当你在嵌入式环境中并且极其空间有限时(通常情况并非如此,几乎所有嵌入式平台都为平台提供了C库).
一个例子可能是使用该isalpha函数实际上可能会拖入包含所有is...函数的目标文件,并且您不需要它们中的任何一个(目标文件是链接时的典型最小单位,尽管某些链接器可以归结为单个函数) .
通过编写自己的代码isalpha,您可以确保将其(仅包含它)合并到最终的二进制文件中.
在某些有限的情况下,您可能会获得更快的速度,而您可能需要执行非常具体的操作,并且库正在处理更常见的情况.同样,只有在特定循环是系统中的瓶颈时才需要.您可能还希望选择与库编写者选择的速度/空间权衡不同的速度/空间权衡,例如正在更改:
int isalpha (int c) {
return ((c >= 'A') && (c <= 'Z')) || ((c >= 'a') && (c <= 'z'));
}
Run Code Online (Sandbox Code Playgroud)
成:
int isalpha (int c) {
static int map[256] = {0,0,0,0,...,1,1,1,...,0,0,0};
return map[c & 0xff];
}
Run Code Online (Sandbox Code Playgroud)
一个(可能)更快的实现,以地图的额外存储为代价(并且您需要了解您的执行环境,因为它不可移植).
不使用它们的另一个原因是提供一种更安全的方法来处理诸如字符串之类的东西,其中安全性/健壮性是一个关键因素.这通常会花费您更多时间来证明正确性.
标准库函数是由非常聪明的人编写的,并且已经过彻底的审查,调试和优化.在每个可以想象的生产环境中,它们都经过了数百万次的测试.您的自定义功能不会更好或更快的机会非常好.
这里已经有很多答案,但除了Stephen Canon之外没有一个解决了最重要的部分:不同的语义.这是选择使用哪些功能的最重要因素.
标准C库isalpha等函数被指定为根据当前语言环境工作.如果将语言环境保留为默认"C"语言环境(通过调用失败setlocale),则它们具有非常可预测的行为,但这排除了使用应用程序的唯一标准化方法来检测和使用系统的/用户首选字符编码,数字格式,消息语言,以及其他本地化偏好.
另一方面,如果您实现自己的isalpha(最佳实现是((unsigned)c|32)-'a'<26或者如果您喜欢更自我记录的代码((unsigned)c|('A'^'a')-'a'<='z'-'a'),它始终具有非常可预测的行为,而不管区域设置如何.
对于除了假定为用户的语言环境格式的文本的朴素文本处理之外的任何事情,我甚至会认为有害于使用标准isalpha等功能.这些函数特别不适合解析配置文件,基于文本的网络事务,HTML,编程语言源等.(一个例外是isdigitISO C需要等同于return (unsigned)c-'0'<10;.)另一方面,如果你'重新编写具有高级自然语言文本处理的应用程序(如文字处理器或Web浏览器),它需要比C库提供的更高级的字符属性处理,您应该寻找一个好的Unicode库.
| 归档时间: |
|
| 查看次数: |
4454 次 |
| 最近记录: |