跳至内容

优化 C++/代码优化/运行时支持

来自维基教科书,自由的教科书

C++ 运行时支持例程显然有相当大的成本,因为否则这种行为将被内联。此处介绍了避免导致隐式调用代价高昂的运行时支持例程的语言特性的技巧。

typeid 运算符

[编辑 | 编辑源代码]

不要使用 typeid 运算符,请使用 virtual 函数。

该运算符可能比虚拟函数调用花费更多时间。

dynamic_cast 运算符

[编辑 | 编辑源代码]

不要使用 dynamic_cast 运算符,请使用 typeid 运算符,或者更优地,使用 virtual 函数调用。

该运算符可能比虚拟函数调用花费明显更多的时间,也比 typeid 运算符花费更多时间。

空异常说明

[编辑 | 编辑源代码]

对于你确信永远不会抛出异常的函数,请使用空异常说明(即在声明末尾追加 throw())。

在 C++11 中,请改用 noexcept

一些编译器会使用此信息来简化处理异常所需的簿记工作。

try/catch 语句

[编辑 | 编辑源代码]

对于每个瓶颈,请将 try 关键字移到瓶颈之前,并将匹配的 catch 子句移到瓶颈之后。

换句话说,将 try/catch 语句从瓶颈中提升出来。

try/catch 语句的执行有时是免费的,但有时会导致速度减慢。避免在瓶颈内重复执行此代码块。

浮点运算与整数运算

[编辑 | 编辑源代码]

如果目标处理器不包含浮点单元,请将浮点函数、常量和变量替换为相应的整数函数、常量和变量;如果目标处理器仅包含单精度浮点单元,请将 double 函数、常量和变量替换为其 float 对应项。

目前的台式机或服务器计算机处理器包含用于单精度和双精度浮点运算的专用硬件,因此此类操作的速度几乎与相应的整数操作一样快。

相反,一些嵌入式系统处理器不包含用于浮点运算的专用硬件,或者包含只能处理单精度数字的硬件。因此,在这些系统中,无法通过硬件执行的操作由非常慢的库函数模拟。在这种情况下,使用整数算术或(如果硬件支持)单精度浮点算术效率更高。

为了使用整数运算来处理小数,每个数字都应被视为乘以一个比例因子。为此,在输入时每个数字都乘以该因子,在输出时除以相同的因子,反之亦然。

数字到字符串转换

[编辑 | 编辑源代码]

使用优化的函数将数字转换为字符串。

将整数或浮点数转换为字符串的标准函数效率很低。为了加快这些操作,请使用非标准的优化函数,这些函数可能是你自己编写的。

使用 cstdio 函数

[编辑 | 编辑源代码]

为了执行输入/输出操作,请使用旧的 C 函数(在 cstdio 头文件中声明),而不是使用 C++ 流。

C++ I/O 原语主要针对类型安全和自定义而设计,而不是针对性能,它们的许多库实现效率很低。特别是,C 语言 I/O 函数 freadfwritefstreamreadwrite 成员函数效率更高。

如果你必须使用 C++ 流,请使用 "\n" 而不是 std::endl,因为 std::endl 还会刷新流。

华夏公益教科书