首页 > 解决方案 > 有没有办法优化 c++ 字符串 += 运算符?

问题描述

英文不好,但请理解。

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;

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

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

标签: c++stringoptimizationoperator-keyword

解决方案


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

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

也许(至少在 Linux 系统上)使用诸如gprof(1)perf(1)time(1)之类的实用程序,或与time(7)相关的函数,例如clock_gettime(2)。至少你会在 Windows 、MacOSX 和 Android 上找到类似的东西。大多数计算机都有一些类似于HPET的硬件。另请参阅OSDEV了解更多信息。

如果您使用最新的GCC编译器,请务必启用优化。所以至少在使用 gprof (1)之前编译和链接 。还要学习使用GDB调试器(或其他调试器)来观察程序的行为(其操作语义)。g++ -Wall -pg -O2 -flto

您可能会对最近的GCC 10编译器能够进行的优化(在 2020 年夏季)感到惊讶,因为即使不使用inline. 如果您碰巧了解汇编代码,请尝试foo.cc使用命令行编译您的 C++ 代码,g++ -O3 -fverbose-asm -S foo.c然后查看生成的foo.s文件。

当然,阅读一本好的C++ 编程书籍并查看这个 C++ 参考网站(以及n3337,一个 C++ 标准)。并阅读您的 C++ 编译器(和链接器)的文档。

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

将此类微优化留给您的 C++ 编译器。

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

当你想到它时,大多数计算机都会花时间做很多无用的操作。阅读已故 J.Pitrat 的博客和他的《人造生物》一书

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

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

如果性能很重要,还可以考虑进行一些元编程和运行时代码生成(例如,使用asmjitlibgccjit或像SBCL一样)。阅读有关部分评估和自动程序生成的更多信息,还请阅读Dragon Book和一些算法简介

另一个答案说:

优化问题乍一看似乎微不足道

当然不是小事。注意赖斯定理

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

大概。考虑使用机器学习方法进行优化,例如MILEPOST GCCCtuning项目。在许多生成分析C++ 代码的开源项目(包括CHRIOTGCCClangRefPerSysFrama-CQtANTLRSWIG)中寻找(至少是为了获得灵感)。

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


推荐阅读