Jac*_*cko 15 c compiler-construction optimization llvm strlen
在我的SAX xml解析回调(XCode 4,LLVM)中,我正在对这种类型的代码进行大量调用:
static const char* kFoo = "Bar";
void SaxCallBack(char* sax_string,.....)
{
if ( strcmp(sax_string, kFoo, strlen(kFoo) ) == 0)
{
}
}
Run Code Online (Sandbox Code Playgroud)
假设strlen(kFoo)由编译器优化是否安全?
(Apple示例代码已经预先计算了strlen(kFoo),但我认为这对于大量常量字符串很容易出错.)
编辑:优化的动机:使用NSXMLParser在iPod touch 2G上解析我的SVG地图需要5秒钟(!).所以,我想切换到lib2xml,并优化字符串比较.
R..*_*R.. 11
不要写像:
static const char* kFoo = "Bar";
Run Code Online (Sandbox Code Playgroud)
您已经创建了一个名为指向常量数据的变量kFoo
.编译器可能能够检测到此变量不会更改并优化它,但如果没有,则会使程序的数据段膨胀.
也不要写像:
static const char *const kFoo = "Bar";
Run Code Online (Sandbox Code Playgroud)
现在你的变量kFoo
是const
限定的和不可修改的,但是如果它在位置无关的代码(共享库等)中使用,那么内容在运行时仍然会有所不同,因此会增加程序的启动和内存成本.相反,使用:
static const char kFoo[] = "Bar";
Run Code Online (Sandbox Code Playgroud)
甚至:
#define kFoo "Bar"
Run Code Online (Sandbox Code Playgroud)
Pas*_*uoq 10
如果通过"LLVM"你的意思是铿锵,那么是的,你可以指望clang -O
优化strlen
离开.以下是函数的代码:
_SaxCallBack:
Leh_func_begin1:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
leaq L_.str1(%rip), %rsi
movl $3, %edx
callq _strncmp
...
Run Code Online (Sandbox Code Playgroud)
我改变了strcmp
到strncmp
,但第三个参数确实已经被眼前所取代$3
.
请注意,gcc 4.2.1 -O3不会优化此strlen
调用,并且您只能期望它在您的问题的精确条件下工作(尤其是字符串和调用strlen
必须在同一个文件中).