如何提高stm32io读写速度

如何提高stm32io读写速度,第1张

设定合适的编译优化选项。

STM32正常运行时对程源氏序运行效率要求不是很高,但是在中断中要求快进快出,尤其是中断数量多且中断里处理的任务较多时,对程序的运行时间及效率要求比较苛刻,可以从以下几点优化程序:设定合适的编纤拦译优化选项

Optimization level -O0

-O0禁用所有优化。使用-O0可以加快编译和构建时间,但是生成的代码比其他优化级别要满。与其他优化级别相比,-O0的代码大小和堆栈使用率明显要高。生成的代码与源代码密切相关,但生成的代码要多得多,包括死代码。

Optimization level -O1

-O1支持编译器中的核心优化。因为这毁裂胡个级别比-O0提供了更好的代码质量,因此它能提供了很好的调试体验。堆栈的使用也在-O0的基础上有所提高。为了获得良好的调试体验,Arm推荐使用此选项。

目前,磁盘是机械 *** 作的,主要是在读取和写入磁盘之前查找磁道的过程中。磁盘附带的读写缓存大小对磁盘读写速度至关重要。具有快速读写的磁盘通常具有较大的读写缓存。磁盘的查找过程是机械的,它确定其随机读写速度将明显低于顺序读写。当我们进行系统设计和实现时,我们需要考虑磁盘的这个特性。

FastDFS是一个开源且高效的分布式文件系统。它的初始实现,文件以散列模式随机分布到多个目录,后来又添加了顺序存储实践。通过比较测试,发现文件按目录顺序存储,写文件的效率明显高于目录随机存储的效率。

目前,磁盘顺序读取的速度还不错。例如,普通硬盘的IO可以达到败梁每秒40~60MB,更好的硬盘可以达到每秒100MB左右。在多进程或多线程并发读取磁盘的情况下,随着并发数量的增加,磁盘IO效率将大大降低。主要是因为每次读取和写入,轨道可能具有大的偏移,并且轨道寻址时间增加,导致磁盘IO的性能急剧下降。对于此方案,优化方案是最小化并发读取和写入的进程或线程的数量。您可以使用锁定机察念运制或专用磁盘IO线程来读取和写入磁盘。在FastDFS 2.x版本中,磁盘读取和写入是使用专用线程完成的。

为了充分利用多个磁盘的效率,建议不要使用传统的RAID方法。一个好的做法是分别安装每个磁盘,并通过程序控制多个磁盘的并发读写。使用单个磁盘安装,可以使用多台计算机实现文件备份和冗余。

在大量文件(例如数千万个文件)之后,当随机访问许多文件时,文件系统的性能将急剧下降。业界流行的做法是通过将多个小文件组合成一个大文件来减少文件数量。 FastDFS 3.0支持将多个小文件合并和存储到一个大文件中。发展进度相对平稳。预计3.0版将于5月发布。高孝

改进磁盘IO的另一个技巧是尽可能多地写入或尽可能多的读取。换句话说,将程序的读写缓冲区设置得尽可能大。例如,日志或重做日志写入,不是每次都直接写入磁盘,而是先缓存到内存中,然后在缓冲区满时写入磁盘,也可以定期写入磁盘。

*** 作系统和C库函数通常会缓存写入文件的内容,以减少实际写入文件的次数。直接调用系统函数fsync或C函数fflush将使系统的缓存机制无效,这将强制将内容刷新到磁盘。除非必要,否则不要执行强制刷牙 *** 作。如果在 *** 作过程中不慎将重要的数据弄丢了,可以用闪灵数据恢复找回数据;如果有重要的资料不希望别人进行查看等 *** 作,可使用闪灵文件夹锁进行加锁。

性能优化我伍敏觉得应该分两步走,第一步:寻找性能瓶颈,第二步:性能调优;

下面分别进行分析:

第一步:寻找性能腔差枝瓶颈

通常性能瓶颈的表象是资源消耗过多、外部处理系统的性能不足;或者资源消耗不多,但是程序效应还是很慢;

资源主要消耗在cpu,文件io,网络io以及内存方面,当某一资源消耗过多会造成系统响应慢;

外部处理系统的性能不足主要是所调用其他系统提供的功能或数据库的响应速度不够,外部系统慢可能也是资源消耗过多导致,数据库响应慢可以对数据库进行调优;

资源消耗不多但仍然慢主要原因是程序代码运行效率不高,未充分使用资源或程序结构不合理;

1.1cpu消耗分析

可以通过相关命令比如top,pidstat,找出各个类型消耗cpu的占比,最常见的就是us和sy类型分别代表用户进程消耗和线程间切换消耗;如果us过高可以找到相关的线程ID然后分析代码;如果sy过高是不是启动了过多的线程导致线程切庆扮换过多;

1.2文件io消耗

要跟踪线程的文件IO消耗,可以通过pidstat来查找,可以查到每秒的读写kb数;找到读写kb数多个线程,然后结合jstack找到相关的java代码,然后分析;

1.3网络io消耗

可以通过sar来分析网络的消耗状况,但是不能具体到每个线程所消耗的网络IO,只能对线程dump,查找产生了大量网络io的线程;

1.4内存消耗

结合top或pidstat,以及jvm的内存分析工具来分析内存消耗;要区分是jvm外的物理内存还是jvmheap区内存;如果是jvm外的物理内存要分析程序中DirectByteBuffer,如果是jvmheap可以通过jvisualvm来分析;

1.5资源消耗不多但仍然慢

主要原因是:锁竞争激烈,未充分使用硬件资源,数据量增长

第二步:性能调优

2.1jvm调优

主要包括各个代的大小、GC策略等;代大小的设置:避免新生代大小设置过小,或者过大;避免Survivor区过小或过大;合理设置新生代存活周期;GC策略根据吞吐量优先还是延迟优先进行设置策略;

2.2程序调优

1.CPU消耗严重解决

us过高主要是执行线程无任何挂起动作,可以进行Thread.sleep *** 作;sy过高主要是因为创建了过多的线程导致线程上下文切换;

2.文件IO消耗严重解决

造成文件IO消耗严重的原因主要是多个线程写大量的数据到同一个文件,导致文件很快变的很大,从而写入速度越来越慢,并造成各线程激烈竞争争抢文件锁,常用的调优方法:异步写文件,批量读写,限流,限制文件大小;

3.网络IO消耗严重解决

主要原因是同时发送或者接受的包太多,解决办法就是限流;

4.内存消耗严重解决

解决:释放不必要的引用,使用对象缓存池,采用合理的缓存失效策略,合理使用softReference和WeakReference;

2.3资源消耗不多但仍然慢

主要原因是:锁竞争激烈,未充分使用硬件资源


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12540989.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存