02 2021 档案
31.使用计时器,分析服务端recv的性能
摘要:服务端: 使用计时器,计时每秒钟调用了多少次recv,收到了多少数据包。recv每次接收1个字节。 客户端:使用计时器,计时每秒钟调用了多少次send函数。 调整客户端的线程数,客户端数量,,服务的线程数,进行观察。 客户端: CELLTimestamp.hpp #ifndef _CELLTimes 阅读全文
posted @ 2021-02-28 21:28 邶风 阅读(130) 评论(0) 推荐(0)
30.多线程,分组服务端,接收数据性能瓶颈与优化
摘要:客户端只发,服务端只收。 服务端代码进行了优化: 1.fd_set进行了备份,如果客户端没有发生接入,离开。则,每次select的时候,使用备份的fd_set。 2.使用std::map<SOCKET, ClientSocket*> _clients;替代vector加快了客户端的查找操作。 客户端 阅读全文
posted @ 2021-02-26 17:56 邶风 阅读(106) 评论(0) 推荐(0)
29.多线程,分组服务端,1万客户端连接,服务端使用
摘要:1.EasyTcpServer服务端的使用。 2.客户端 发送 登录消息服务端接收登录消息 返回消息给 客户端 存在问题:网络抖动较大 客户端: DataHeader.hpp #ifndef _MessageHeader_hpp_ #define _MessageHeader_hpp_ enum C 阅读全文
posted @ 2021-02-25 19:40 邶风 阅读(106) 评论(0) 推荐(0)
28.多线程,分组服务端,1万客户端连接,代码优化
摘要:客户端只发送数据,服务端只接收数据。 服务端增加,用户接入,离开函数。 客户端增加,判断是否成功连接服务端标志。 问题:服务端接收客户端数据包,不稳定,波动比较大。 客户端代码: DataHeader.hpp #ifndef _MessageHeader_hpp_ #define _MessageH 阅读全文
posted @ 2021-02-25 13:42 邶风 阅读(106) 评论(0) 推荐(0)
27.多线程,分组服务端,1万客户端连接,每秒处理200万包
摘要:问题:网络抖动,不能稳定在每秒钟,200万个包。波动比较大,80万 300万之间波动。 服务端: CELLTimestamp.hpp #ifndef _CELLTimestamp_hpp_ #define _CELLTimestamp_hpp_ #include <chrono> using nam 阅读全文
posted @ 2021-02-23 21:37 邶风 阅读(128) 评论(0) 推荐(0)
26.服务端单线程模式下性能瓶颈测试
摘要:VS2015 提供的性能探查器,可以看到程序的哪部分代码占用了多少的cpu 在Release版本下,使用,性能探查器 开始 运行一段时间之后,停止收集,创建详细报告 可以看到 FD_SET select 这几个函数占用的cpu比较高 尝试: 将服务端改造成,多线程分组处理多客户端 1.分离处理客户端 阅读全文
posted @ 2021-02-06 21:34 邶风 阅读(115) 评论(0) 推荐(0)
25.客户端多线程分组模拟高频并发数据
摘要:两种结构的客户端对比网络消息性能 服务端均为单线程服务端。 1.单线程客户端,1000个连接 2.多线程客户端,4个线程,每个线程250个连接 结论:多线程的客户端,网络性能提升非常大。 多线程客户端的代码: DataHeader.hpp #ifndef _MessageHeader_hpp_ #d 阅读全文
posted @ 2021-02-05 21:59 邶风 阅读(148) 评论(0) 推荐(0)
24.原子操作
摘要:参考资料:https://zhuanlan.zhihu.com/p/107092432 所谓原子操作,就是多线程程序中“最小的且不可并行化的”操作。 对于在多个线程间共享的一个资源而言,这意味着同一时刻,多个线程中有且仅有一个线程在对这个资源进行操作,即互斥访问。 #include <iostrea 阅读全文
posted @ 2021-02-05 16:00 邶风 阅读(53) 评论(0) 推荐(0)
23.线程锁的使用
摘要:不合理的设定临界区域,会让线程的调用失去意义。 1.不应该频繁的使用锁 2.减小锁使用的区域,线程公共资源之外 的资源 尽量不要放到临界区。 示例一:(这样使用线程锁,设定的临界区域不合理,会让线程的调用失去意义,线程并没有并发执行) #include <iostream> #include <th 阅读全文
posted @ 2021-02-04 20:02 邶风 阅读(111) 评论(0) 推荐(0)
22.线程自解锁
摘要:代码结构比较复杂的情况下,手动加锁,解锁,可能会有所遗漏。 这种情况下,推荐使用自解锁(自解锁在构造的时候lock,在析构的时候unlock)(对象在超出作用域时会执行析构) 自解锁,手动锁优缺点:自解锁每次都会构造,析构。在执行效率上没有手动锁效率高。 演示代码: 示例一:手动加锁,解锁(要在每个 阅读全文
posted @ 2021-02-04 19:56 邶风 阅读(103) 评论(0) 推荐(0)
21.多线程-锁与临界区域
摘要:不合理的设定临界区域,会让线程的调用失去意义。 代码一: #include <iostream> #include <thread> #include <mutex> using namespace std; mutex m_lock; void workFun(int index) { for ( 阅读全文
posted @ 2021-02-04 16:31 邶风 阅读(117) 评论(0) 推荐(0)
20.多线程-基本代码
摘要:示例一: #include <iostream> #include <thread> using namespace std; void thread1() { for (int n = 0; n<4; n++) cout << "i am child thread" << endl; }//抢占式 阅读全文
posted @ 2021-02-03 20:47 邶风 阅读(146) 评论(0) 推荐(0)
19.添加高精度计时器测量处理能力
摘要:在windows系统下可以使用“资源监视器”来查看网络活动详情。 在服务端代码中添加一个高精度计时器,统计每秒钟收到了多少个完整数据包。 c++11 chrono(高精度时钟,可达纳秒级别) 客户端: DataHeader.hpp #ifndef _MessageHeader_hpp_ #defin 阅读全文
posted @ 2021-02-03 20:02 邶风 阅读(96) 评论(0) 推荐(0)