bru*_*ais 0 c micro-optimization
我正在开发一个程序,我们在竭尽所能地提高性能,现在我们进入了微优化阶段(同时避免了非严格必要的代码重复)。
想象一下这样的小代码:
propertyContent = gets_x_prop( propStruct );
propertyContent = ( propertyContent ? propertyContent : strdup("") );
/// ....
/// ....
/// ....
free(propertyContent)
Run Code Online (Sandbox Code Playgroud)
做出了决定,我们确定下一个要考虑攻击的是对空字符串strdup的许多调用。
请记住,我们需要有一个char*in变量,以简化随后出现的代码并使之更直接(避免引起的错误(void*)0)
问题在于如何优化它……
到目前为止,我们只能实现一个自定义函数:
char* a = malloc(1);
a[0] = NULL;
Run Code Online (Sandbox Code Playgroud)
我们认为,这种方法应该有其他选择。我们还不希望将所有内容替换free()为执行NULL检查的宏,因为我们认为它对我们来说很难。
我们自己的测量表明,当前,等待时间最多的是在malloc中,例如strdup中发生的事件,其中一些会复制空字符串。
不需要宏,也不需要空检查。free(NULL)定义明确,安全且禁止操作。
因此,只需删除所有可解决此问题的代码:
propertyContent = gets_x_prop(propStruct);
// …
free(propertyContent);
Run Code Online (Sandbox Code Playgroud)
做完了
也就是说,现在意味着propertyContent可以是NULL,这意味着仍然需要检查它的所有用法NULL,这当然远非理想。将其指向动态分配的空字符串会使它的使用变得更加简单,因此更加安全。您需要确定性能的微小提高是否值得放弃这种安全性。
如果要确保非NULL字符串,但又担心堆碎片,请用可以安全有效地表示空字符串的对象替换对象模型。简单地说,这意味着替换free如下:
// Header
extern const char EMPTY[];
void mystr_free(char *);
Run Code Online (Sandbox Code Playgroud)
// Implementation
const char EMPTY[] = "";
void mystr_free(char *str) {
if (str != EMPTY) free(str);
}
Run Code Online (Sandbox Code Playgroud)
这与(不必要的)NULL检查宏的方向相同,但是具有永不NULL字符串的所有好处。
| 归档时间: |
|
| 查看次数: |
96 次 |
| 最近记录: |