当前位置: 首页 > news >正文

做网站还是做游戏公司做的网站访问很慢

做网站还是做游戏,公司做的网站访问很慢,嘉兴市平湖市建设局网站,wordpress 全部函数简介 在嵌入式开发中#xff0c;经常有需要用到RingBuffer的概念#xff0c;在RingBuffer中经常遇到一个Buffer满和Buffer空的判断的问题#xff0c;一般的做法是留一个单位的buffer不用#xff0c;这样做最省事#xff0c;但是当RingBuffer单位是一个结构体时#xff0…简介 在嵌入式开发中经常有需要用到RingBuffer的概念在RingBuffer中经常遇到一个Buffer满和Buffer空的判断的问题一般的做法是留一个单位的buffer不用这样做最省事但是当RingBuffer单位是一个结构体时这个浪费就不能接受了市面上大多数解决办法是镜像指示位办法但是具体实现上又有各种设计但是并不是满足的开发需要所以有本项目。 本项目地址bobwenstudy/simple_ringbuffer: 一种基于镜像指示位办法的RingBuffer实现解决Mirror和2的幂个数限制 (github.com)参考资料有环形缓冲器 - 维基百科自由的百科全书 (wikipedia.org)ring buffer一篇文章讲透它 - 知乎 (zhihu.com)。 对比现有的实现本项目的特点是。 类别simple_ringbufferkfifo(linux)ringbuffer (rt-thread)需要mirror位多进程风险否否是需要个数为2的幂否是否支持结构体成员是是linux5.7否 mirror位 多了Mirror位就会有一个多进程操作的风险除非Mirror位和数值同时写入。所以最好不要有Mirror位。 个数为2的幂 Linux的kfifo解决了Mirror位的问题因为其用到了uint32_t回环的特性需要个数为2个幂。虽然这样大大减少了算法工作量也可以用位运算来优化取余预算的计算效率。但是使用起来多少不是很舒适尤其设计到对结构体成员操作时一不注意又要浪费Buffer。 支持结构体成员 其实如果RingBuffer成员的单位为1个字节的话其实没必要在乎1个字节的损失只是使用时需要多申请1个字节多少看起来不是很清爽。 但是当RingBuffer的成员的单位为很大的值时1个成员的损失才至关重要。 现有的项目考虑灵活性RingBuffer需要支持各种字节操作效率并不高本项目针对结构体操作需要专门设计了Data_RingBuffer工具来对多字节场景进行处理操作效率更高并提供了2种操作接口以满足不同业务操作的需要。 镜像指示位-本项目实现 本项目不想有Mirror的操作问题也不想有个数2的幂的限制。处理上做了一些特殊的处理严格区分index和ptr的概念。 index的取值范围为[0~2n-1]并不像Linux取到最大值解决了个数2的幂的限制。 write_index ringbuf-write_index len; if (write_index (ringbuf-total_size 1)) {write_index - (ringbuf-total_size 1); } ringbuf-write_index write_index;其中ptr的获取考虑效率使用减法不使用取余运算。 #define RINGBUFFER_INDEX_TO_PTR(_index, _total_size) \((_index _total_size) ? (_index - _total_size) : (_index)) uint32_t wptr RINGBUFFER_INDEX_TO_PTR(ringbuf-write_index, ringbuf-total_size);代码结构 代码结构如下所示 simple_ringbufferRingbuffer实现包含结构体操作实现simple_data_ringbuffer和缓冲池操作实现simple_data_ringbuffer。test_0.c和test_1.c和test_2.c测试例程。main.c测试例程。build.mk和MakefileMakefile编译环境。README.md说明文档 simple_ringbuffer├── simple_ringbuffer│ ├── simple_data_ringbuffer.c│ ├── simple_data_ringbuffer.h│ ├── simple_ringbuffer.c│ └── simple_ringbuffer.h├── build.mk├── code_format.py├── LICENSE├── main.c├── Makefile├── README.md├── test_0.c└── test_1.c使用说明 具体如何使用直接看例程就行非常简单看函数名和变量名即可。 单字节操作 使用提供simple_ringbuffer.h接口操作即可。 // Define ringbuf. SIMPLE_RINGBUFFER_DEFINE(test_ringbuf, 0x100);// Put data to ringbuf. uint8_t data[0x10]; simple_ringbuffer_put(test_ringbuf, data, sizeof(data));// Get data from ringbuf. uint8_t rdata[0x10]; simple_ringbuffer_get(test_ringbuf, rdata, sizeof(rdata));结构体操作 使用提供simple_data_ringbuffer.h接口操作即可。提供了两种接口按需使用。 struct test_user_data {uint8_t data[0x10]; };// Define ringbuf. SIMPLE_DATA_RINGBUFFER_DEFINE(test_ringbuf, 0x100, sizeof(struct test_user_data));// API1 // Put data to ringbuf. struct test_user_data data; simple_ringbuffer_put(test_ringbuf, data);// Get data to ringbuf. struct test_user_data rdata; simple_ringbuffer_get(test_ringbuf, rdata);// API2 // Enqueue data to ringbuf. struct test_user_data *data NULL; uint16_t index simple_data_ringbuffer_enqueue_get(test_ringbuf, (void **)data); // enqueue getsimple_data_ringbuffer_enqueue(test_ringbuf, index); // real enqueue// Dequeue data from ringbuf. struct test_user_data *data; data simple_data_ringbuffer_dequeue_peek(test_ringbuf); // dequeue peeksimple_data_ringbuffer_dequeue(test_ringbuf); // real dequeue缓存池操作 ringbuffer必须先入先出在部分不是先入先出场景下又想用RingBuffer读写线程独立的特性本项目提供了一个简易数据缓存池实现方案通过只保存数据指针的方式来实现非先入先出的数据缓冲池。 其结构体如下。simple_pool_t用于缓冲池管理由于RingBuffer存储的是指针所以需要通过item_size记录每个成员的实际大小。定义一个Pool时需要指针数组_name##_fifo_storage[_num]其用于存储实际存放数据的指针用RingBuffer管理。真实存数据的区域为_name##_data_storage[_num][MROUND(_data_size)]。 typedef struct simple_pool {simple_data_ringbuffer_t ringbuf;uint16_t item_size; } simple_pool_t;#define SIMPLE_POOL_DEFINE(_name, _num, _data_size) \static simple_pool_t _name; \static void *_name##_fifo_storage[_num]; \static uint8_t _name##_data_storage[_num][MROUND(_data_size)];使用操作如下 struct test_user_data {uint8_t data[0x100]; };// Define pool. SIMPLE_POOL_DEFINE(test_pool, 0x10, sizeof(struct test_user_data));// Init pool. SIMPLE_POOL_INIT(test_pool, 0x10, sizeof(struct test_user_data));// Get data from pool. struct test_user_data *data; SIMPLE_POOL_DEQUEUE(test_pool, data);// Put data to pool. SIMPLE_POOL_ENQUEUE(test_pool, data);测试说明 环境搭建 本项目支持Windows和Linux编译同时支持Code Space在线编译如果不想搭建环境可以直接CodeSpace编译。 Windows编译 目前需要安装如下环境 GCC环境笔者用的msys64mingw用于编译生成exe参考这个文章安装即可。Win7下msys64安装mingw工具链 - Milton - 博客园 (cnblogs.com)。 GitHub-CodeSpace编译 直接在线编译即可。 编译说明 本项目都是由makefile组织编译的编译整个项目只需要执行make all即可。 也就是可以通过如下指令来编译工程 make all而后运行执行make run即可运行例程例程中实现了上述文档说明的问题和API的基本测试。 PS D:\workspace\github\simple_ringbuffer make run Compiling : test_0.c Compiling : test_1.c Linking : output/main.exe Building : output/main.exe Start Build Image. objcopy -v -O binary output/main.exe output/main.bin copy from output/main.exe [pei-i386] to output/main.bin [binary] objdump --source --all-headers --demangle --line-numbers --wide output/main.exe output/main.lst Print Sizetext data bss dec hex filename118200 265384 2644 386228 5e4b4 output/main.exe ./output/main.exe Testing test_work .......................................................... pass Testing test_work_insuff ................................................... pass Testing test_work_invalid .................................................. pass Testing test_work_full ..................................................... pass Testing test_work_full_define .............................................. pass Testing test_work_read_index_big_to_write_index ............................ pass Testing test_work_read_index_big_to_write_index ............................ pass Testing test_work_odd ...................................................... pass Testing test_work_insuff_odd ............................................... pass Testing test_work_invalid_odd .............................................. pass Testing test_work_full_odd ................................................. pass Testing test_work_read_index_big_to_write_index_odd ........................ pass Testing test_data_work ..................................................... pass Testing test_data_work_full ................................................ pass Testing test_data_work_full_define ......................................... pass Testing test_data_work_full_define_enqueue ................................. pass Testing test_data_work_odd ................................................. pass Testing test_data_work_full_odd ............................................ pass Executing run: all complete!可以看到所有涉及到测试都通过。
http://www.hkea.cn/news/14437789/

相关文章:

  • 网站建设get你有哪些可以在线做app的网站有哪些问题
  • 论坛的网站制作做电商必备的八个软件
  • 网站关键词排名优化价格网络广告策划
  • 网站建设准备资料表格pyhton可以做网站吗
  • 潍坊网站制作人才招聘临沂经开区建设局网站
  • 可以找网图的软件长沙网站seo技术厂家
  • 精通网站建设 100%全能建站密码pdf常德做网站报价
  • 想开一个网站开发的公司wordpress编辑空两格
  • 主视觉设计网站ppt软件下载免费版
  • 国内免费图片素材网站快手直播间挂人气自助网站
  • 方便做流程图的网站做房产网站哪个好
  • 网站建设售后回访话术物流企业网站织梦模板
  • 郑州定制网站推广工具产品北京 网站设计公司
  • 网站稳定性网络推广网站推广方法
  • 企业网站建设规划设计任务书跨境平台哪个最好做?
  • 做外贸的网站开店流程开源阅读app
  • 商城网站建设预算要多少钱广东网络建设有限公司
  • 怎么在百度做网站网站建设 系统 排名
  • 免费app大全下载郑州网站优化汉狮网络
  • 不花钱怎么做网站运营谷歌下载安装
  • 在网上帮做图片的网站汕头网站建设方法
  • 江门网站建设junke100域名暂无法进行网站备案
  • 松溪网站建设wordpress获取作者
  • 网站设计培训班哪家好长宁专业做网站
  • 海南百度推广中心惠州做网站乐云seo
  • 网站建设和维护pdf网站建设项目实训报告
  • 企业网站建设具体步骤wordpress媒体选项
  • 知识竞赛网站建设方案策划书上高县城乡规划建设局网站
  • 怎么收录网站网站打不开 清理缓存后可以打开
  • 专门做酒店设计的网站个人做网站开发