C++火车头优化

c++,火车头,优化 · 浏览次数 : 20

小编点评

**火车头优化** ```cpp #pragma GCC optimize(2) // 优化编译器优化等级为 2 ``` **其他优化** - 使用格式化输入输出 (scanf 与 printf)。 - 优化运算符 (a % 2 -> a & 1)。 - 利用奇妙优化 (endl换为 ‘\’)。 - 优化快读快写: - 使用 `inline int read() { ... }` 声明一个内联函数 `read()`,并使用 `return` 返回最后一位数字。 - 使用 `inline void write(int x) { ... }` 声明一个内联函数 `write(int x)`,并使用 `return` 返回无影响的返回值。 **示例优化** ```cpp #include #include int main() { int n, m; // 使用格式化输入输出 scanf("%d %d", &n, &m); // 使用奇妙优化 printf("%d\n", n + m); // 使用内联函数 int ans = read() * 2; write(ans); return 0; } ``` **其他建议** - 不要使用 `#pragma GCC optimize` 的任何级别超过 2,因为这会影响编译器的性能。 - 在优化代码时,务必测试,确保性能提升是合理的。 - 了解编译器的优化选项,并根据情况进行调整。

正文


火车头:将下面的代码加在头文件前即可

#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize(2)

另外,在有些地方您不能加火车头,您还可做这些优化:

1.将标准输入输出(cin与cout)改为格式化输入输出(scanf与printf),或者优化标准输入输出(即在主函数内第首行加入如下代码):

ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);

2.运算符优化:比如将a%2改为a&1,将a*2改为a<<1等等

3.奇妙优化:把endl换成’\n’(据说endl每次输出都要刷新一次缓冲区,所以就慢)

4.快读快写
我常用的:

inline int read() {
	int x = 0, f = 1;
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		if (ch == '-') f = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
	return x * f;
}
void write(int x) {
	if (x < 0) putchar('-'), x = -x;
	if (x > 9) write(x / 10);
	putchar(x % 10 + '0');
	return;
}

在主函数内直接这么调用:

n = read(), m = read();
write(ans);

总之,有时候还是我们自己写的算法有缺陷,才会导致TLE等问题,这些优化并不是通用的。
所以还是好好学算法吧

与C++火车头优化相似的内容:

C++火车头优化

​ 火车头:将下面的代码加在头文件前即可 #pragma GCC optimize(3) #pragma GCC target("avx") #pragma GCC optimize("Ofast") #pragma GCC optimize("inline") #pragma GCC optimi

[转帖]C++:perf详解 + Flame Graph火焰图分析程序性能

因为项目需求,C++和java同时在搞,最近了解到Flame Graph火焰图这个工具,网上查了查资料,这里记录一下。 1 介绍 web site http://www.brendangregg.com/flamegraphs.html git: https://github.com/brendan

C++判断当前程序是否运行在Windows展台(Kiosk)模式下

Windows有一个展台(Kiosk)模式。展台模式可以使Windows作为数字标牌进行使用。具体请参考Windows 展台 配置完展台模式,重启设备后,Windows会以全屏的方式运行展台应用,无法进入桌面。有点类似iPhone中的引导者模式。此时我们自己的应用如果设置了开机自启,也会运行,但是会

C++获取商店应用(msix应用)桌面快捷方式的安装目录

传统应用的快捷方式目标指向可执行文件的路径,但是对于商店应用(也叫msix打包应用),则指向一个奇怪的字符串,使用IShellLink::GetPath获取路径时,则得到的是空字符串,而我们的最终目的是要拿到应用的安装路径,那该怎么办呢? 首先解释一下,那个奇怪的字符串叫AUMID(App User

C++面向对象

1. C++语言基础 1.1 函数 C++新增:多态 函数重载( overload ) 函数重写(覆写,overrride) 编译器会根据实参的类型来⾃动确定调⽤哪个重载函数 C++新增:内联函数 修饰关键字:inline 作用:编译时直接将函数替换为一堆代码,减少函数调用带来的开销。 比#defi

C++面向对象多级菜单向Arduino的移植

前段时间写了一篇文章《C++面向对象语言自制多级菜单》,文中指出了可以将HeleMenu库进行移植,现已完成技术思路,特此记录。 一、特性 基本与上一篇文章指出的一致,只是将菜单显示和响应函数合二为一 二、代码实现 基本与上一篇文章指出的一致,只是考虑到右值和左值的问题,将形参改为了const类型

「C++」复杂模拟【壹】

建议开启目录食用 阅读本文之前建议您先看这里,如果您已经看完了,那么就可以放心大胆的学习本文了。 我认为其实本文的难度还是比较大的,今天我们题是来自山东省省选,所以建议大家谨慎阅读,如果您是专业程序员当我没说。 OK,那么事不宜迟,咱们来看第一题 [SDOI2010] 猪国杀 题目描述 游戏背景 《

「C++」简单模拟

这是一个公式: \[F_n=\dfrac{\left(\frac{1+\sqrt{5}}{2}\right)^n-\left(\frac{1-\sqrt{5}}{2}\right)^n}{\sqrt{5}} \]根据大家的数学经验可以知道这是一个计算斐波那契数列的公式,那么假设我们不知道这是一个斐波

C++面向对象语言自制多级菜单

因为要做一个小应用,需要一个菜单类,在网上找了许久,也没有找到一款心仪的菜单类,索性用C++语言,自制一个命令行级别的菜单类,并制作成库,现记录下来,供以后借鉴。 一、特性 无限制条目 无限制层级 用户自定义条目和动作 脚本式生成菜单类 二、代码实现 (一)菜单类 菜单类主要负责菜单的创建、修改、删

「C++」论高精度

大家好,我是Charzie。在编程领域,高精度计算是一个常见的问题。当标准的整型或浮点型无法满足我们的计算需求时,高精度计算就显得尤为重要。在C++中,虽然标准库没有直接提供高精度数据类型,但我们可以通过一些技巧和工具类来实现高精度计算。 为什么需要高精度? 在编程中,我们经常会遇到一些大数计算的问