【问题标题】:Is optimizing small std::strings wiht c-style functions often pointless?用 c 风格的函数优化小的 std::strings 通常是没有意义的吗?
【发布时间】: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。

标签: c++ string char malloc


【解决方案1】:

对于小字符串,使用动态存储毫无意义。分配本身比比较慢。标准库实现者知道这一点,并优化了std::basic_string,使其不使用带有小字符串的动态存储。

使用 C 字符串不是“优化”。

【讨论】:

    猜你喜欢
    • 2013-04-20
    • 2018-11-02
    • 1970-01-01
    • 2023-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-12
    相关资源
    最近更新 更多