优化 C++/代码优化/运行时支持
C++ 运行时支持例程显然有相当大的成本,因为否则这种行为将被内联。此处介绍了避免导致隐式调用代价高昂的运行时支持例程的语言特性的技巧。
不要使用 typeid
运算符,请使用 virtual
函数。
该运算符可能比虚拟函数调用花费更多时间。
不要使用 dynamic_cast
运算符,请使用 typeid
运算符,或者更优地,使用 virtual
函数调用。
该运算符可能比虚拟函数调用花费明显更多的时间,也比 typeid
运算符花费更多时间。
对于你确信永远不会抛出异常的函数,请使用空异常说明(即在声明末尾追加 throw()
)。
在 C++11 中,请改用 noexcept
。
一些编译器会使用此信息来简化处理异常所需的簿记工作。
对于每个瓶颈,请将 try
关键字移到瓶颈之前,并将匹配的 catch
子句移到瓶颈之后。
换句话说,将 try/catch
语句从瓶颈中提升出来。
try/catch
语句的执行有时是免费的,但有时会导致速度减慢。避免在瓶颈内重复执行此代码块。
如果目标处理器不包含浮点单元,请将浮点函数、常量和变量替换为相应的整数函数、常量和变量;如果目标处理器仅包含单精度浮点单元,请将 double
函数、常量和变量替换为其 float
对应项。
目前的台式机或服务器计算机处理器包含用于单精度和双精度浮点运算的专用硬件,因此此类操作的速度几乎与相应的整数操作一样快。
相反,一些嵌入式系统处理器不包含用于浮点运算的专用硬件,或者包含只能处理单精度数字的硬件。因此,在这些系统中,无法通过硬件执行的操作由非常慢的库函数模拟。在这种情况下,使用整数算术或(如果硬件支持)单精度浮点算术效率更高。
为了使用整数运算来处理小数,每个数字都应被视为乘以一个比例因子。为此,在输入时每个数字都乘以该因子,在输出时除以相同的因子,反之亦然。
使用优化的函数将数字转换为字符串。
将整数或浮点数转换为字符串的标准函数效率很低。为了加快这些操作,请使用非标准的优化函数,这些函数可能是你自己编写的。
为了执行输入/输出操作,请使用旧的 C 函数(在 cstdio
头文件中声明),而不是使用 C++ 流。
C++ I/O 原语主要针对类型安全和自定义而设计,而不是针对性能,它们的许多库实现效率很低。特别是,C 语言 I/O 函数 fread
和 fwrite
比 fstream
的 read
和 write
成员函数效率更高。
如果你必须使用 C++ 流,请使用 "\n"
而不是 std::endl
,因为 std::endl
还会刷新流。