咳咳咳……好东西 _(:зゝ∠)_ 转自某位大佬 http://www.cnblogs.com/widerg/p/7353866.html
补上另一更巨的巨佬的https://blog.xehoth.cc/PerformanceOptimization/
C++ Interesting卡常数
作为一名OIer,在Noip中卡(kǎ)常数可以说是必备技巧。在此总结一下我所知卡常数的神奇手法:
- IO优化
- fread 和 fwrite ,如果还想再优化有mmap....(然而并不会用,好像也没用。。。)
- 读入优化(这个非常重要!!!!!!!)
inline int Read() { int x=0,f=1;char c=getchar(); while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9') {x=x*10+c-'0'; c=getchar();} return x*f; } - 输出优化好像用不到唉( ˇˍˇ )
-
inline
在声明函数之前写上inline修饰符(就像上面Read()一样),可以加快一下函数调用,但只能用于一些操作简单的函数。涉及递归,大号的循环等很复杂的函数,编译器会自动忽略inline。 -
register
在定义变量前写上register修饰符,用于把变量放到CPU寄存器中,适用于一些使用频繁的变量:register int n,m; 寄存器空间有限,如果放得变量太多,多余变量就会被放到一般内存中;
快,不是一般的快,快到什么程度呢?:register int a=0; for(register int i=1;i<=999999999;i++) a++; int a=0; for(int i=1;i<=999999999;i++) a++; 结果:
优化:0.2826 second
不优化:1.944 second
恐怖啊!!!! -
循环展开
循环展开也许只是表面,在缓存和寄存器允许的情况下一条语句内大量的展开运算会刺激 CPU 并发(前提是你的 CPU 不是某 CPU)...
-
取模优化(仅O2)
//设模数为 mod inline int inc(int x,int v,int mod){x+=v;return x>=mod?x-mod:x;}//代替取模+ inline int dec(int x,int v,int mod){x-=v;return x<0?x+mod:x;}//代替取模- -
前置 ++
后置 ++ 需要保存临时变量以返回之前的值,在 STL 中非常慢。事实上,int 的后置 ++ 在实测中也比前置 ++ 慢 0.5 倍左右(UOJ 上自定义测试)
-
不要开bool,所有bool改成char,int是最快的(原因不明)。
-
if()else语句比()?():()语句要慢,逗号运算符比分号运算符要快。
-
数据结构用指针代替数组(个人觉得无关紧要)
数组在用方括号时做了一次加法才能取地址!
所以在那些计算量超大的数据结构中,你每次都多做了一次加法!!!在 64 位系统下是 long long 相加,效率可想而知。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
2016-10-17 POJ-2142 The Balance(扩展欧几里得)
2016-10-17 POJ-1061 青蛙的约会(扩展欧几里得)