常数优化那点事

(被各位神犇的代码所虐,故设此文)

(纯经验之谈,如能指出其原理或谬误,欢迎留言)

测试环境:

OS:Linux Ubuntu 14.04LTS

Memory:8GB

Processor:Intel® Core™ i7-4500U CPU @ 1.80GHz × 4

Compiler:GNU G++ 4.8.4(switch on -O3 optimization in release mode)

Part I:输入(若无特殊说明,输入类型为int,scanf每执行一次只接收一个参数)

C++ iostream的优化语句(使用后要避免C++ IO和C-style IO混用):

std::ios::sync_with_stdio(0);

std::cin.tie(0);

不加以上优化时std::cin的耗时约为scanf的4倍(不管是否开启-Ox编译优化)

加上优化后的耗时与scanf相当

读入优化在不开-Ox时与scanf相比并没有优势,开-Ox后比scanf快10%~15%

而scanf的速度似乎与一次接收的参数个数有关,输入量一定时,一次读5个的用时比一次读1个快10%~15%,且不受编译优化开关影响

 1 #include <iostream>
 2 #include <cctype>
 3 #include <initializer_list>
 4
 5 #if __cplusplus < 201103L
 6 #include <bits/c++0x_warning.h>
 7 #endif // __cplusplus
 8
 9 template <class IstreamType, class IntType>
10 void _read_positive_integer (IstreamType& ist, IntType& dest)
11 {
12     dest = 0;
13     char ch = ist.get();
14     while (!isdigit (ch)) ch = ist.get();
15     while (isdigit (ch))
16     {
17         dest *= 10;
18         dest += ch - ‘0‘;
19         ch = ist.get();
20     }
21 }
22
23 template <class IstreamType, class IntType>
24 void _read_integer (IstreamType& ist, IntType& dest)
25 {
26     dest = 0;
27     char ch = ist.get();
28     while (!isdigit (ch) && ch != ‘-‘) ch = ist.get();
29     if (ch == ‘-‘)
30     {
31         ch = ist.get();
32         while (isdigit (ch))
33         {
34             dest *= 10;
35             dest -= ch - ‘0‘;
36             ch = ist.get();
37         }
38     }
39     else while (isdigit (ch))
40         {
41             dest *= 10;
42             dest += ch - ‘0‘;
43             ch = ist.get();
44         }
45 }
46
47 template <class IstreamType, class IntType, class... Args>
48 inline void readPositiveInteger (IstreamType& ist, IntType& first,
49                                  Args& ... args)
50 {
51     std::initializer_list<int> dummy =
52     { (_read_positive_integer (ist, first), 0), (_read_positive_integer (ist, args), 0)... };
53 }
54
55 template <class IstreamType, class IntType, class... Args>
56 inline void readInteger (IstreamType& ist, IntType& first, Args& ... args)
57 {
58     std::initializer_list<int> dummy =
59     { (_read_integer (ist, first), 0), (_read_integer (ist, args), 0)... };
60 }

Input optimization with C++ style input

————To be continued————

时间: 2024-10-15 01:11:49

常数优化那点事的相关文章

[黑科技]常数优化的一些技巧

感谢wys和小火车普及这些技巧qwq 这篇文章大概没什么营养 我们来看一道十分简单的题目: 设n=131072,输入两个长度为n的数列和,要求输出一个长度为n的数列. 其中,. 首先我们来讲讲这题怎么做. 如果数据是随机的,那么有一种神奇的做法:在a和b中分别挑出最大的p个元素,对于每个i暴力枚举每个p进行更新,这样的复杂度是O(np)的,正确性我不会分析= = 那么数据不是随机的...那么估计没有什么快速的算法,不如暴力! 以下的运行时间均为在我的渣渣笔记本中测试得到,仅供参考.测试环境Ubu

bubblesort的常数优化

内容来自TsinghuaX: 30240184X 数据结构(2015秋)这门课的Vector一章,对bubblesort有两次常数优化. 函数原型是这样的: void bubble(Rank lo, Rank hi); void bubbleSort(Rank lo, Rank hi); Rank即向量元素的秩,在此被定义为int型.lo和hi为待排序区间的左.右界桩. 外部通过调用 v.bubbleSort(lo, hi) 来给向量v的区间[lo,hi)排序,而bubbleSort调用bubb

NYOJ 654 喜欢玩warcraft的ltl (01背包常数优化)

[题目链接]:click here~~ 一个常数优化 前面的伪代码中有 for v=V..1,可以将这个循环的下限进行改进. 由于只需要最后f[v]的值,倒推前一个物品,其实只要知道f[v-w[n]]即可.以此类推,对以第j个背包,其实只需要知道到f[v-sum{w[j..n]}]即可,即代码中的 for i=1..N     for v=V..0 可以改成 for i=1..n     bound=max{V-sum{w[i..n]},c[i]}     for v=V..bound 这对于V

spoj 4487. Can you answer these queries VI splay 常数优化

4487. Can you answer these queries VI Problem code: GSS6 Given a sequence A of N (N <= 100000) integers, you have to apply Q (Q <= 100000) operations: Insert, delete, replace an element, find the maximum contiguous(non empty) sum in a given interval

iOS_UITableView性能优化那点事

UITableView在实际开发中使用频率实在是很高, 因此, UITableView的性能优化是必不可少的, 本文下面就略微总结一下UITableView性能优化那点事. 本文着重介绍具体方法, 原理的话在文章最后会给出一些链接, 有兴趣可以自行查看. 1. 关于数据绑定 很多新加入iOS的朋友喜欢把数据绑定写入在UITableView Data Source方法 - (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPa

青岛网站优化公司,7天见效从此优化不是事

青岛网站优化公司可以满足不同的客户群体.如果你想要把自己的产品信息广布各大门户信息,让自己的产品信息随时随地都可以看到那么请继续往下观看: 青岛网站优化公司精准优化优势是什么? 1.各大搜索引擎首页排名推广! 2.7天就能见到效果!速度快! 3.100-1000个关键词全面覆盖! 4.承诺80%产品信息在首页!有保障! 5.无需任何操作!只管看效果报表! 6.精准潜在客户一网打尽! 7.最小预算赚取最大推广效益! 8.信息掉落免费更换关键词! 9.一对一专业客服,贴心服务! 10.报表实时更新!

常数优化技巧

今天让我们整理一下一些常数优化技巧: 1. 读入优化: #define sight(c) ('0'<=c&&c<='9') inline void read(int &x){ static char c; for (c=getchar();!sight(c);c=getchar()); for (x=0;sight(c);c=getchar())x=x*10+c-48; }//使用方法 read(x); 这是一直基于getchar的快速读入.相比大家都会,不说了. 2.

做OI题时的一些常用的常数优化小技巧

注意:本文所介绍的优化并不是算法上的优化,那个就非常复杂了,不同题目有不同的优化.笔者要说的只是一些实用的常数优化小技巧,很简单,虽然效果可能不那么明显,但在对时间复杂度要求十分苛刻的时候,这些小的优化对于帮助你成功卡常也是十分重要的.那么我们让切入正题吧. (1)inline放在自定义函数前 不要问为什么,加就行了!额,这个东西好像可以让你的函数有机会被计算机执行得稍微快一点,一般放在使用次数比较多的函数前,像check(),为sort()定制的CMP()等等,当然主函数前就不要放了...比如

常数优化

虽然大部分的题都不会卡常数,但是万一卡常还是很恶心的,让我们一起来看看常数优化吧~   (蒟蒻太蒟了,可能无法覆盖到所有常数优化,请见谅~) register&inline CPU有高速缓存,那个速度非常快,但占用内存小,加上这register后,这个变量的存放位置就在register高速缓存里.一般用于频繁修改的变量(如循环中的变量) 如: for(register int i++;i<=100;++i) cout<<i<<" "; 在系统下,栈