本文介绍的常数优化方法或者能使代码略微加速,或者是一般人写代码时就习惯写成较快的方式
注意STL函数的时间复杂度
例1:
以下遍历char[]的两种方法
for(int i = 0; i < str.size(); i++)
和
for(int i = 0, len = str.size(); i < len; i++)
不使用O2等优化的情况下,前者的复杂度是O(n^2),后者是O(n)
例2:
n * n
相比
pow(n, 2)
快很多
除法运算比乘法运算慢得多
设变量n是浮点型,以下两个语句
i / 2
i * 0.5
除法比乘法慢得多
整数的自增和自减,++和--尽量放前面
++i 比 i++ 略快一点
大循环放内层
以下两段代码
for(int i = 1; i <= 10; i++){
for(int j = 1; j <= 1000000; j++){
}
}
和
for(int i = 1; i <= 1000000; i++){
for(int j = 1; j <= 10; j++){
}
}
前者运行速度比后者快
unsigned数据的除法比signed快
进行除法时,可以考虑写成
(unsigned int)n / m;
但是由于类型转换本身需要消耗时间,所以总是大于0的变量都可以定义为unsigned
减少函数的值传递
以下两段代码
bool compare(string str1, string str2)
和
bool compare(string *str1, string *str2)
前者运行速度慢,当数据很大时,这种差距更加显著
避免过大的循环
如果两个函数f1和f2互相不影响,那么把
for(int i = 1; i <= n; i++){
f1();
f2();
}
这种写法改成下面这种会快不少
for(int i = 1; i <= n; i++){
f1();
}
for(int i = 1; i <= n; i++){
f2();
}
当且仅当循坏过大时才拆开!循环语句本身的耗时很大,执行一次的用时仅次于除法
用构造函数赋初值
用好构造函数,例如定义一个整形变量sum并将其初值赋为0,一般的写法
int sum = 0;
改成
int sum(0);
会快一些
ps.这种方法对运行效率的提高微乎其微,所以大可忽略不计
pair类型尽量使用有序赋值,即大括号
pair类型的有序赋值
p = {a, b};
比std方法
p = make_pair(a, b);
快1.5倍左右
关于乘法的一个小误区
通常情况下,将
n *= 10;
写成位运算的
n = (n << 1) + (n << 3);
并不能提高效率,有时甚至还会变慢
关于vector插入元素
运用了就地构造和强制类型转换的
vector.emplace_back();//(C++11起)
比基于拷贝构造的
vector.push_back();
有显著的内存优化,运行效率也有一定的提升
标签:string,int,unsigned,++,vector,常数,除法,优化 From: https://www.cnblogs.com/xj22yangyichen/p/16947247.html