有什么方法可以优化 c++ string += operator 吗?

Is there any way to optimize c++ string += operator?

英语不好,请谅解

string str;
string str_base = "user name = ";
string str_user_input;
string str_system_message;
...

str = str_base + str_user_input + "\n [system message :]" + str_system_message;

cout << str << endl;

我正在使用现有的代码,有没有办法优化字符串?

我认为这段代码做了很多无用的操作。有没有办法优化?

你的问题是 +=,但你并没有在任何地方使用 +=。您仅使用 +.

"+" 可能是连接字符串的最有效方式。还有其他方法,但不太可能+更糟。

正如 John Bollinger 所说,如果您需要做的只是输出连接结果,那么直接输出片段:

cout << str_base << str_user_input << "\n [system message :]" << str_system_message << endl;

或者使用 C++20(正如 Thomas Sablik 所说):

std::format("{}{}\n [system message :]{}", str_base, str_user_input, str_system_message); otherwise: fmt::format("{}{}\n [system message :]{}", str_base, str_user_input, str_system_message);

我建议尝试优化代码的其他部分(如果需要的话),因为您不太可能比语言/编译器做得更好。忘记优化 +.

换个角度看这个问题的答案:

Efficient string concatenation in C++

I think this code does a lot of useless operations. Is there a way to optimize?

不要猜测,但要通过分析来衡量。

也许(至少在 Linux 系统上)使用 gprof(1) or perf(1) or time(1), or functions related to time(7) such as clock_gettime(2). You'll find similar things for Windows and MacOSX and Android at least. Most computers have some hardware similar to HPET. See also OSDEV 等实用程序以获得更多。

如果您最近使用 GCC compiler, be sure to enable optimizations. So compile and link with at least g++ -Wall -pg -O2 -flto before using gprof(1). Learn also to use the GDB debugger (or another one) to observe the behaviour of your program (its operational semantics).

您可能会对最近 GCC 10 compiler is capable of (in summer 2020), since it will do inline expansion 的优化感到惊讶,即使没有询问 inline。如果您碰巧了解汇编代码,请尝试使用命令行 g++ -O3 -fverbose-asm -S foo.cfoo.cc 中编译您的 C++ 代码,然后查看生成的 foo.s 文件。

当然要好好读一读C++ programming book and see this C++ reference website (and n3337,一个C++标准)。并阅读您的 C++ 编译器(和链接器)的文档。

I think this code does a lot of useless operations. Is there a way to optimize?

将这样的 micro-optimizations 留给您的 C++ 编译器。

首先确保您的代码是正确的,然后花精力进行分析和优化。

当你想到它时,大多数计算机都花时间做很多无用的操作。阅读 blog of the late J.Pitrat and his Artificial beings book.

作为软件开发人员,您的职责是平衡您的开发工作与计算机时间。今天,计算机大部分时间都比软件开发人员便宜

如果原始性能非常重要,请花时间编写汇编代码。如果使用 Linux,请阅读 Linux Assembly HowTo。准备好比 C++ 低 10 倍的生产力....

考虑也做一些 metaprogramming and runtime code generation (e.g. with asmjit or libgccjit, or like SBCL does) if performance is important. Read more about partial evaluation and automatic program generation, read also the Dragon Book and some Introduction to Algorithms

说:

optimization problems look trivial at the first look

当然不是微不足道的。注意 Rice's theorem!

I think this code does a lot of useless operations. Is there a way to optimize?

可能吧。考虑 machine learning approaches to optimizations, like in MILEPOST GCC or Ctuning projects. Look (at least for inspiration) inside many open source projects (including CHARIOT, GCC, Clang, RefPerSys, Frama-C, Qt, ANTLR, SWIG),它 生成 分析 C++ 代码。

重要的问题是经济:是否值得您花时间(例如花费 个月 的努力,也许编写您的 GCC plugin)将您的代码优化 1%?在某些情况下,这是值得的,在大多数情况下是不值得的。

简单地说,有一些优化方法:

首先,通过使用 += 而不是多个 + 操作,您将避免创建一些临时对象。

也就是喜欢做:

s += s1;
s += s2;
s += s3;

而不是:

s = s1 + s2 + s3;

其次,可以在调用(上面的 += 示例)之前将字符串的大小相加并在 s 中保留内存。

话虽如此(我确实提到这是一个“简单化”的答案),但还有一些其他注意事项:

  • 语言设计者和编译器开发者已经花了很多时间来优化字符串操作,你不太可能通过 micro-optimizations 在处理字符串和用户输入的函数中显着优化你的代码 (除非字符串非常大,除非这是关键路径上的代码,除非您在非常受限的系统中工作)。

  • 你可能被否决了,因为看起来你专注于错误的问题来解决。

  • 优化问题乍一看似乎微不足道,但在您设定性能目标和衡量当前性能的方法之前,您很可能会在错误的地方寻找优化(看起来像你现在正在做)。