C++提高算法速度的方法

实战篇 | 22 C++ 高性能计算—运算加速 小知识:如何取存在数组中的元素指针 怎么样处理需要放在一个容器里放在元素的指针,那个指针该怎么取出来? 我们先来看一段代码 咋看起来没什么问题,可是当程序运行之后,你会发现输出来的东西完全不是你想用的,为什么 在上面这个for循环中,我创建了一个局部变量student,然后我把这个student push到一个vector里,这其实是一次拷贝。然后我把这个指针的地址存到另一个v... 阅读详情

在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的read语句的速度是C/C++中scanf比不上的,C++选手只能干着急。难道C++真的低Pascal一等吗?答案是不言而喻的。一个进阶的方法是把数据一下子读进来,然后再转化字符串,这种方法传说中很不错,但具体如何从没试过,因此今天就索性把能想到的所有的读数据的方式都测试了一边,结果是惊人的。

竞赛中读数据的情况最多的莫过于读一大堆整数了,于是我写了一个程序,生成一千万个随机数到data.txt中,一共55MB。然后我写了个程序主干计算运行时间,代码如下:

最简单的方法就算写一个循环scanf了,代码如下:

#include <ctime>  
int main()  
{  
    int start = clock();  
    //DO SOMETHING  
    printf("%.3lf\n",double(clock()-start)/CLOCKS_PER_SEC);  
}  

最简单的方法就算写一个循环scanf了,代码如下:

int numbers[MAXN];  
void scanf_read()  
{  
    freopen("data.txt","r",stdin);  
    for (int i=0;i<MAXN;i++)  
        scanf("%d",&numbers[i]);  
}  

可是效率如何呢?在我的电脑Linux平台上测试结果为2.01秒。接下来是cin,代码如下

const int MAXN = 10000000;  
   
int numbers[MAXN];  
   
void cin_read()  
{ 
    freopen("data.txt","r",stdin); 
    for (int i=0;i<MAXN;i++)  
        std::cin >> numbers[i];  
}  

出乎我的意料,cin仅仅用了6.38秒,比我想象的要快。cin慢是有原因的,其实默认的时候,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,同时cout和stdout也一样,两者混用不会输出顺序错乱。正因为这个兼容性的特性,导致cin有许多额外的开销,如何禁用这个特性呢?只需一个语句std::ios::sync_with_stdio(false);,这样就可以取消cin于stdin的同步了。程序如下:

const int MAXN = 10000000;

int numbers[MAXN];

void cin_read_nosync()  
{  
    freopen("data.txt","r",stdin);  
    std::ios::sync_with_stdio(false);  
    for (int i=0;i<MAXN;i++)  
        std::cin >> numbers[i];  
}  

取消同步后效率究竟如何?经测试运行时间锐减到了2.05秒,与scanf效率相差无几了!有了这个以后可以放心使用cin和cout了。
接下来让我们测试一下读入整个文件再处理的方法,首先要写一个字符串转化为数组的函数,代码如下

const int MAXS = 60*1024*1024;  
char buf[MAXS];  
   
void analyse(char *buf,int len = MAXS)  
{  
    int i;  
    numbers[i=0]=0;  
    for (char *p=buf;*p && p-buf<len;p++)  
        if (*p == ' ')  
            numbers[++i]=0;  
        else  
            numbers[i] = numbers[i] * 10 + *p - '0';  
}  

把整个文件读入一个字符串最常用的方法是用fread,代码如下:

const int MAXN = 10000000;  
const int MAXS = 60*1024*1024;  
   
int numbers[MAXN];  
char buf[MAXS];  
   
void fread_analyse()  
{  
    freopen("data.txt","rb",stdin);  
    int len = fread(buf,1,MAXS,stdin);  
    buf[len] = '\0';  
    analyse(buf,len);  
}  

上述代码有着惊人的效率,经测试读取这10000000个数只用了0.29秒,效率提高了几乎10倍!掌握着种方法简直无敌了,不过,我记得fread是封装过的read,如果直接使用read,是不是更快呢?代码如下:

const int MAXN = 10000000;  
const int MAXS = 60*1024*1024;  
   
int numbers[MAXN];  
char buf[MAXS];  
   
void read_analyse()  
{  
    int fd = open("data.txt",O_RDONLY);  
    int len = read(fd,buf,MAXS);  
    buf[len] = '\0';  
    analyse(buf,len);  
}  

结果非常的amazing啊!

添加:

sync_with_stdio

这个函数是一个“是否兼容stdio”的开关,C++为了兼容C,保证程序在使用了std::printf和std::cout的时候不发生混乱,将输出流绑到了一起。

cin.tie()

cin.tie(NULL);只解除的是C++运行库层面的对数据传输的绑定。
STDIN和STDOUT应该在更底层的操作系统层面有绑定,没有解除
可以通过tie(0)(0表示NULL)
来解除cin与cout的绑定,进一步加快执行效率。

加速器

#include
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(0); //标准流
}

C++多线程教程(三)利用多线程实现加速 简介 在前期基础知识储备以后,让我们正式进入利用多线程实现程序加速的环节 基本思想 将原始计算过程拆分为多个过程。例如计算五亿次加法过程。我们可以将其分为两个过程,从零加到两万五,再从两万五加到五万。 程序实现 下面的程序分别展示用两个线程和单个线程实现五亿次加法过程。measure测量时间函数已经在上一章节中详述,不再重复。 int main() { long times = 50000000... 阅读详情

相关推荐

C/C++快速读写磁盘数据的方法-块读取/异步/优化分析算法/内存文件映射的原理和使用

快速读写磁盘数据的方法: 1.一下子将数据读取到内存的(无论是文本还是二进制),而不是一行行的读取。 2.异步的IO,创建多线程,或者使用重叠IO,IO复用,异步的事件回调通知机制(可以用事件对象,信号驱动来实现)。 3.使用内存文件映射, window是CreateFileMapping,MapViewOfFile,UnmapViewOfFile,CloseHandle;linux是用

自由理想的足迹 1万+

ios::sync_with_stdio(false)

ios::sync_with_stdio(false)的一些小知识

qq_41026725的博客 6996

【C++】随机数生成原理

本文主要讨论 C++ 中最常用的几种随机数生成方法。

Chenyang的博客 2090

探寻C++最快的读取文件的方案

  在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的read语句的速度是C/C++中scanf比不上的,C++选手只能干着急。难道C++真的低Pascal一等吗?答案是不言而喻的。一个进阶的方法是把数据一下子读进来,然后再转化字符串,这种方法传

lyy learn C 3578

优化C++图像压缩算法速度

此外,还可以使用算法上的优化技巧,如空间换时间、预计算等,来减少计算量。此外,选择适当的图像压缩算法,如JPEG、PNG或WebP,可以根据具体的需求进行选择。在C++开发中,优化图像压缩算法的速度可以提高图像处理的效率。使用高效的数据结构和算法,利用并行化处理和优化算法实现,可以最大限度地发挥计算机硬件的性能,实现更快速的图像压缩。当然,具体的优化方法还需要根据具体的图像压缩算法和应用场景进行选择和调整。不同的算法可能需要不同的优化策略,因此在优化过程中需要进行实验和测试,根据实际情况进行调整和改进。

JfBackend的博客 365

C++实现二分法算法

它使用while循环不断计算中间位置mid,并与目标值进行比较,根据比较结果更新左右边界。二分法的主要思想是:先确定数组的中间位置mid,然后将待查找项与mid位置上的元素进行比较。如果待查找项小于mid位置上的元素,则在前半部分继续查找;如果大于mid位置上的元素,则在后半部分继续查找;它需要在有序的数据集合中查找特定的目标值,通过将数据集合分成两个部分来减少每次比较的次数,从而提高查找效率。二分法算法适用于数据集合有序的情况,时间复杂度为O(log n),相对于暴力搜索可以大大提高效率。

CyberNova的博客 422

【C++】C++中的sync_with_stdio(false)介绍

C++中sync_with_stdio(false)是一种提升cin、cout效率的手段,使用C语言中的格式输入输出(scanf / prinrf)比C++中的标准输入输出(cin / cout)要快很多,在代码里加上这个语句后,cin(cout)速度就会变得和scanf(printf)一样快本质上是一个iostream与stdio流的同步的开关,C++为了兼容C,保证程序在使用了std::printf和std::cout的时候不发生混乱,将输出流同步到了一起。

qq_35902025的博客 5074

ModbusRTU串口读写报文解析

解析MODBUS报文的格式,讨论异常状态、读多个寄存器与写多个寄存器

Serendipitor的博客 9212

【视觉算法工程师内参】:掌握这8种C++优化手法,图像处理速度提升10倍

掌握C++计算机视觉实践中的8种关键优化手法,显著提升图像处理效率。适用于实时检测、识别等场景,通过内存优化、并行计算等技术实现速度飞跃。算法工程师必备技巧,值得收藏。

PoliVein的博客 992

Vue3项目实战:集成h265webjs打造高性能Web端H.265播放器

本文详细介绍了如何在Vue3项目中集成h265webjs库,构建高性能的Web端H.265播放器。通过封装播放器管理模块、利用Vue3组合式API优雅管理生命周期,并提供了从环境准备、核心集成到进阶优化的完整实战指南,有效解决了浏览器原生不支持H.265解码的难题,显著降低视频流带宽占用。

weixin_29016833的博客 365

Voltus功耗分析——读入Innovus数据/cpf/spef文件

检查的内容:物理库、时序库、网表、I/Os、tie-high&tie-low pins、电源/地pins。设计数据(LEF/DEF/netlist)、cpf文件、SPEF文件。方法二:定义每个 power/ground net's 电压。4.设计数据检查(design sanity check)方法一:读入.dat数据。方法二:读入def文件。方法一:读入CPF文件。

qq_44347276的博客 3991

算法提高 快速幂

  算法提高 快速幂  时间限制:1.0s   内存限制:256.0MB    问题描述  给定A, B, P,求(A^B) mod P。输入格式  输入共一行。  第一行有三个数,N, M, P。输出格式  输出共一行,表示所求。样例输入2 5 3样例输出2数据规模和约定  共10组数据  对100%的数据,A, B为long long范围内的非负整数,P为int内的非负整数。 ..快速幂代码:...

程序员伤不起 276

【yolov8】与yolov5的区别及改进详解

yolov8-----有点厉害的目标检测框架.

qq_44878985的博客 3万+

不朽 C++ 为新贵 Python 应用提速 8000 倍!

在人工智能浪潮之下,全民学习 Python 已成为必然趋势。Python 作为一门胶水语言,以简单的语法、良好的交互性、移植性等优势受到诸多开发者的喜爱,但要和老牌的 C++ 相较而言,谁运行的速度更快一些?相信很多开发者会毫无疑问地选择了 C++,而本文作者也证实了这一点。 以下为译文: 最近我在开发一个名为 Bard(https://github.com/antlarr/bard)的命令行应用...

qq_44545083的博客 219

Python实战:5分钟搞定N-CMAPSS航空发动机数据集解析(附完整代码)

本文提供了一份针对N-CMAPSS航空发动机数据集的快速解析实战指南。通过Python的h5py库,详细演示了如何读取HDF5文件结构、理解数据分类(如传感器、健康参数、场景描述符)并加载为Pandas DataFrame。文章还澄清了数据集中常见的变量数量疑惑,并给出了从数据加载到构建剩余使用寿命预测模型预处理流水线的完整代码,帮助工程师和研究人员高效入门航空发动机预测性维护分析。

weixin_29057065的博客 422

34、木材在家具制造中的应用

本文详细探讨了木材在家具制造中的应用,从木材的选择、加工技术到设计创新和表面处理等方面进行了全面解析,并结合实际案例分析木材家具的市场趋势与未来发展。文章强调了木材家具在功能性、智能化和环保性方面的潜力,展示了其在现代家居生活中的重要地位。

flink9streamer的博客 243

MATLAB调用C++开发——尝试写一个套着C++皮的Matlab函数

在之前的工作中《MATLAB调用C++开发——函数大全》,我们已经介绍了Matlab调用C++的一些基本函数,下面我们将开始写我们的第一个Matlab C++混编代码。 在开始之前,我们要明确在Matlab调用c++代码的几种情况。 拿到的代码只有C++版本。 自己写的算法for循环过多,速度慢,需要加速。 装杯 ε=ε=ε=┏(゜ロ゜;)┛ (奇怪的知识增加了) 1 配置你的C++编译器 编译C++时候,系统里面一定要有编译器,比如MSVC, MinGW, GCC等等,输入mex -setup根据向

小玺大大 1626

金融领域强化学习在高频交易中的应用

强化学习(Reinforcement Learning,简称RL)是一种机器学习范式,通过智能体与环境的交互来学习策略,以最大化累计奖励。与监督学习和无监督学习不同,强化学习依赖于动态的反馈机制,智能体通过试错不断优化决策过程。高频交易(High-Frequency Trading,简称HFT)是指在极短时间内进行的大量金融交易,通常利用算法和计算机系统自动执行交易策略。高频交易依赖于高速的数据处理和决策能力,以捕捉市场中的微小价格波动。状态(State):环境在某一时刻的观测,反映了系统的当前情况。

AI天才研究院 894

它发现了更快的排序算法,速度快 70%

来源:机器之心 本文约3700字,建议阅读5分钟 AlphaDev 发现了一种全新且更快的排序算法。「通过交换和复制移动,AlphaDev 跳过了一个步骤,以一种看似错误,但实际上是捷径的方式连接项目。」这种前所未见、违反直觉的思想不禁让人回忆起 2016 年那个春天。七年前,AlphaGo 在围棋上击败人类世界冠军,如今 AI 又在编程上给我们上了一课。近期,Google DeepMind CE...

数据派THU 232

[QMT量化交易小白入门]-七十六、从tick数据中获取高频交易的量价背离信号

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 794

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

答题卡识别C++版本(一)

之前用Python+Opencv 写过答题卡识别的算法。 这篇博客用的C++和Opencv来完成答题卡的识别,相关算法的思想是不变的。 (一)定位答题卡的四个边角锚点 因为标准答题卡的四角都有黑色的圈圈,将这些圈圈的位置定位出来,就相当于定位出四个边角锚点。 定位黑色圆圈,有两种方式: (1)霍夫圆检测,找到圆心的位置,这个方法我在之前的Python版本中已经用过。但是我用C++来...

qq_33531400的博客 3071

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

如何提升C++ 代码性能-以loop为例

C++代码性能优化,主要利用循环展开,register 和gcc自带优化去提高C++程序性能。

qq_32639369的博客 1387

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

运用C++查找素数

运用改进的算法求素数,是常规方法的19.6倍

qq_59382597的博客 8054

C++ 斐波那契数列递归求解 进阶版

可以转载,请附加作者名字,谢谢!

sim8011的博客 809

[Matlab+C/C++] 读写二进制文件

introduction 由于Matlab操作简单、方便,它被应用于非常多领域:音频处理,图像处理,数值计算等。虽然MATLABeasy操作。但受限于他的语言解释机制。MATLAB的运行速度通常较低。C/C++一般被觉得是运行较为高效的高级程序设计语言。假设结合MATLAB和C/...

aoe41606的博客 361

c/c++快速读入模板

最近牛客刷题没无论怎样改样例都没法过,百度一波都是用的c语言直接过的,后来发现cin读取数据太慢了,于是找了网上的模板 1.去除锁 //快速读取数据 std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); 2.快速读入板子 #define re register inline long long read() { re long long x=0,f=1; re char ch=get

Cherish的博客 1145
上一篇: 二分问题模板
下一篇: 震惊!算法题中输入时加getchar()的原因竟是因为它!......
Andy in boots
博客等级 码龄7年 73粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值