常数优化2

本文介绍的常数优化方法或者能使代码略微加速,或者是一般人写代码时就习惯写成较快的方式

注意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();

有显著的内存优化,运行效率也有一定的提升

posted @ 2022-12-03 11:35  xj22yangyichen  阅读(43)  评论(0)    收藏  举报