浅谈OI中的底层优化!
众所周知,OI中其实就是算法竞赛,所以时间复杂度非常重要,一个是否优秀的算法或许就决定了人生,而在大多数情况下,我们想出的算法或许并不那么尽如人意,所以这时候就需要一中神奇的的东西,就是底层优化;
其实底层优化比较简单,比如我们经常使用的 register还有快读,这些都可以进行优化。还有fread,但是fread在一些情况(尤其是在重要的的比赛时)但是还是给出下面的优化
const int L=<<|;
char buffer[L],*S,*T;
#define getchar() ((S==T&&(T=(S=buffer)+fread(buffer,1,L,stdin),S==T))?EOF:*S++)
#define debug(x) cerr<<(x)<<" x"<<endl;
#define re register
inline LL read()
{
re LL a=,b=;char t;
do{t=getchar();if(t=='-')a=-;}while(t>''||t<'');
do{b=b*-''+t;t=getchar();}while(t>=''&&t<='');
return a*b;
}
还有的话就是一些位运算优化来卡常:那么我们经常使用的运算其实是非常慢的,他的时钟周期如下:

那么我们就可以想象到平时我们写程序的时候其实是常数巨大的
优化就是自己打函数,不调用库函数,由于stl的封装,导致调用函数的时候都是很慢的

介绍一下inline函数,这个可以让函数强制在线,其实可以把他当成当你使用它的时候,他可以将你写的函数相当于复制粘贴一般的直接插入代码,减少了部分访问函数的时间;
但是这并不是所谓的强制的,他只是建议在线,并且递归函数不能调用,其实编译器并不会报错,因为加了inline编译器也不会在线,因为编译器无法预测递归的层数;

这个其实是减少浮点除法的优化方法;
由于他麻烦,所以笔者在考试和刷题过程中并没有使用过,感兴趣的神犇可以尝试一下,我先说好,如果没有十足的把握,不要在考试的时候使用,一切后果自负;

我在网上看见了神犇的重新定义了log函数,据说比调用stl中的函数快了1.4倍,但是蒟蒻表示看不懂,据说这是指令集的汇编语言(本蒟蒻瞎比比的)
其实重载一些运算其实真的挺有用的,他可能有时候真的可以卡常,还有这个关于指令集,之前学长来给我们讲课的时候说过一句,说是wc2015(好像是)里面介绍了指令集n方过百万的方法;
但是笔者还未达到那种水平,所以在这里就不做介绍了,至于他的可使用性,经过学长的证实,他确实使用指令集n方过了十万,其实已经非常强了


这是一些常用的位运算来优化常数(其实在平时并用不大,或许只有丧心病狂的人才痴迷于这个)
然后其实就没有什么了,还有就是可以将循环展开,因为从一个循环跳转到下一个循环的时候会调用很多时钟周期,这样很耗时,循环展开很好使,但是循环展开代码复杂度很大,稍有不慎就会车毁人亡;

这是常用的函数重载

位运算优化
这里我就想说一点,笔者其实并不喜欢关于卡常这方面的东西,但是笔者身边总有一些人不再算法上改正,光企图使用卡常的手段通过一些数据很水的题,其结果并没有达到训练的目的,而且我很欣赏一句话: 在实现之前的任何优化都是罪恶之源
所以这篇博客只是希望我和大家可以学到一些技巧,并不希望大家和我痴迷于此;
endl;
浅谈OI中的底层优化!的更多相关文章
- [技术]浅谈OI中矩阵快速幂的用法
前言 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中,矩阵的运算是数值分析领域的重要问题. 基本介绍 (该部分为入门向,非入门选手可以跳过) 由 m行n列元素排列成的矩形阵列.矩阵里的 ...
- 浅谈OI中的提交答案
在OI中,题目有三类: 传统题 交互题 提交答案题 今天来了解一下第三类 概述 传统题:给你一个题面,你需要交一个程序,评测姬会用你的程序运行你看不到的一些测试点,用输出和正确答案比较 提交答案题:给 ...
- 浅谈iOS中的视图优化
引言: 让我们来思考几个问题,你开发过的产品,它还有可以优化的地方吗?能增加它的帧率吗?能减少多余的CPU计算吗?是不是存在多余的GPU渲染?业务这点工作量对于越来越强大的设备面前显得微不足道,但作为 ...
- 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载
浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...
- 浅谈Java中set.map.List的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- Java基础学习总结(29)——浅谈Java中的Set、List、Map的区别
就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是想对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...
- 浅谈JS中的闭包
浅谈JS中的闭包 在介绍闭包之前,我先介绍点JS的基础知识,下面的基础知识会充分的帮助你理解闭包.那么接下来先看下变量的作用域. 变量的作用域 变量共有两种,一种为全局变量,一种为局部变量.那么全局变 ...
- 浅谈Java中的final关键字
浅谈Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...
- 浅谈 .NET 中的对象引用、非托管指针和托管指针 理解C#中的闭包
浅谈 .NET 中的对象引用.非托管指针和托管指针 目录 前言 一.对象引用 二.值传递和引用传递 三.初识托管指针和非托管指针 四.非托管指针 1.非托管指针不能指向对象引用 2.类成员指针 五 ...
随机推荐
- 02-17 kd树
目录 kd树 一.kd树学习目标 二.kd树引入 三.kd树详解 3.1 构造kd树 3.1.1 示例 3.2 kd树搜索 3.2.1 示例 四.kd树流程 4.1 输入 4.2 输出 4.3 流程 ...
- MySQL学习(三)MySQL锁与事务
本章我们着重讨论MySQL锁机制的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议. 一.MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支 ...
- Vue-cli父子组件之间传参
一.父传子( 先写父组件 父组件 <template> <子组件 :子组件的变量名='父组件的变量'> </子组件> //子组件的变量名前的冒号千万别丢了有和没有是 ...
- 微信小程序登入流程
微信小程序登入流程 一.首先前端先传code去后端 wx.login({ success(res) { if (res.code) { //发起网络请求 wx.request({ url: app.g ...
- 使用Prometheus监控SpringBoot应用
通过之前的文章我们使用Prometheus监控了应用服务器node_exporter,数据库mysqld_exporter,今天我们来监控一下你的应用.(本文以SpringBoot 2.1.9.REL ...
- Java IO_003.Reader与Writer--字符流以及编码对数据的操作(读取与写入)
Java IO之Reader与Writer对象常用操作(包含了编码问题的处理) 涉及到文件(非文件夹)内容的操作,如果是纯文本的情况下,除了要用到File(见之前文章),另外就必须用到字符输入流或字符 ...
- 设计模式(十三)Visitor模式
Visitor模式可以用来把数据结构与处理分离开.通俗来说就是编写一个访问者类来访问数据结构中的元素,并把对各元素的处理交给访问者类.这样,当需要增加新的处理时,只需要编写新的访问者,然后让数据结构可 ...
- 修改List<Map<String, Object>>的值
List<Map<String, Object>> aList = new ArrayList(); //加入一个Map元素Map map = new HashMap();m ...
- Text 尺寸获取
获取text在当前文本内容下应该尺寸: 宽度:text.preferredWidth 高度:text.preferredHeight
- 如何让OKR实践变得更简单一些
什么是OKR 近几年OKR的概念在国内开始流行起来了,之前公司也有人想实施OKR,但现在看来之前的OKR实施者只是在哪儿看了一下OKR的资料,本着跟老板邀功的想法比较功利的在推进,所以基本没有效果,今 ...