【发布时间】:2021-11-22 20:32:39
【问题描述】:
假设我们有以下代码,我们决定对其进行一些优化:
/// BM_NormalString
bool value = false;
std::string str;
str = "orthogonal";
if (str == "orthogonal") {
value = true;
}
到目前为止,我们已经提出了两个非常简单明了的策略:
/// BM_charString
bool value = false;
char *str = new char[11];
std::strcpy(str, "orthogonal");
if (std::strcmp(str, "orthogonal") == 0) {
value = true;
}
delete[] str;
/// BM_charStringMalloc
bool value = false;
char *str = (char *) std::malloc(11);
std::strcpy(str, "orthogonal");
if (std::strcmp(str, "orthogonal") == 0) {
value = true;
}
free(str);
如果我们尝试benchmark 我们的三种方法,我们会非常惊讶地发现没有太大区别。 尽管在本地进行基准测试给了我更令人惊讶的令人不安的结果:
| Benchmark | Time | CPU | Iterations |
|----------------------|------------------|-----------|---------------|
| BM_charString | 52.1 ns | 51.6 ns | 11200000 |
| BM_charStringMalloc | 47.4 ns | 47.5 ns | 15448276 |
| **BM_NormalString** | 17.1 ns | 16.9 ns | 40727273 |
那么你会说,对于这么小的字符串,采用“裸机”风格(通过使用 C 风格的字符串函数)几乎没有意义?
【问题讨论】:
-
不知道为什么你会期望 c 风格的字符串首先更快。尤其是这样简单的例子。
-
我们决定对其进行一些优化: -- 您应该使用数据构造字符串,而不是构造空字符串。 See this。此外,正如@eerorika 的回答所指出的那样,编译器的
std::string类的实现者不是普通的C++ 编码器。无论他们在优化字符串操作中能找到什么优势,他们都会找到。如果他们真的认为malloc-ing 内存更快,他们就会知道并使用它。 -
谢谢你,@PaulMcKenzie。这将我本地基准测试的时间从 17ns 减少到 8ns。