C++经验总结

如果你觉得太长:

我总结下思想,你就可以走了。

1. 算法上的优化比工程上的优化靠谱的多。

2. 非得工程优化,那就研究数据,然后造适合这些数据的轮子,会有很快的加速。

3. 尽量一次分配很大的空间然后自己填充每个小对象,而不是每次用到在分配。也会快很多。

4. 对于新手来说,尽量使用位运算,而不是乘号除号。

好了,本文就这么多,你可以走了。

 

1. 线程安全的计数器可以使用boost::atomic_int来表示。

2. 对于深层次大对象的析构,析构函数析构所占用的时间不能够忽视,可以采用在函数外部打印消耗时间和函数内部打印消耗时间,两者做差,即可得到函数内部的析构时间。

3. 获取线程号,不仅能通过传参来得到,还可以使用gettid和getpid两个函数来得到。

4. int,uint型的指针可以使用使用uintptr_t来代替。比如 uint64_t ptr = 0x000000af可以使用uintptr_t ptr = 0x000000af来代替。

5. 如果环境变量说找不到某个so,可以使用g++48--print-file-name=libasan.so来定位库的位置。

6. 如果string长期存在,而又需要多处使用,可以使用string_ref来进行替代,这个结构体里面只保存了char*和length所以赋值和传递起来比较快,同理可以创建其他种类的ref。

7.  指针相减一般表示长度。那么可以使用ptrdiff_t来表示指针相减的值,这样做可以更加安全。

8. asan是一种c++的错误检测工具,可以检测很多种类的错误。比如,越界,段错误,内存错误等。并且会打出很详细的错误信息。

 

最近我司举办了编程大赛,又从实践中获取了很多优化的点。

9. STL中的hash表因为扩容等原因,要比自己写的closed hash表慢一倍左右。所以在工作生产中应该使用自己写的闭hash而不是STL中的hash表,这样效率会高很多。

10. 有时会遇到字符串做key的情况,hash表中hash函数一般使用while循环一个字符一个字符去hash,还有判断是否hash冲突中用到的==一般是由strncmp代替,虽然strncmp已经使用simd优化,但效率还是太低。可以使用将字符创强行转换成long的这种做法,转换后,直接使用long的==去对比,也会快很多。

11. 在追求效率极致的情况下,可以将hash表的桶长从大质数换成1<<24,然后对桶长取余可以改成h^(1<24 - 1),实测这种做法会比取余快很多,原因是%符中有除法操作,除法操作比位置指令,亦或等指令要慢很多。

12. 预分配空间:vector的预分配空间可以避免再次移动的问题,string的预分配空间,可以使string只去做memcpy而不去开辟空间。

13. std::string 真的很慢。如果想更快的构造,可以模拟string的24个字节的头部,然后拼接字符串。太麻烦而且效率不一定有提升。

14. read到内存,然后在操作,比直接mmap要稍微快一些,在顺序读写的情况下。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值