存储套接字信息随机访问速度
Storing Socket Information Random Access Speed
现状:我有一个linux服务器(用于与陌生人聊天),我有一个关于效率的问题。
目前我在一个简单的管理器类中使用一个地图来配对两个陌生人:
int sockManager::set_pair(int me, int them) {
if (them != -1) {
pairs[me] = them;
pairs[them] = me;
return 1;
}
return -1;
}
int sockManager::get_pair(int me) {
return pairs[me];
}
void sockManager::add_single(int me) {
pairs[me] = -1;
}
void sockManager::remove_single(int me) {
if (pairs[me] != -1)
pairs[pairs[me]] = -1;
pairs.erase(me);
}
int sockManager::find_unconnected(int me) {
if (pairs[me] != -1)
return pairs[me];
for (iter = pairs.begin();iter!=pairs.end();iter++){
if (iter->second == -1 && iter->first != me)
return iter->first;
}
return -1;
}
int sockManager::get_size(){
return pairs.size();
}
我使用这个管理器类的原因是为了可扩展性。例如,现在我想改变我寻找两个客户端连接的方式。我想要一个"需要联系"标志,和一个简单的线程,不断运行,并找到客户端连接,当客户端不能连接,如果时间已经超过x秒,给他们一个有趣的说法或东西(让他们娱乐),我还需要确保客户端没有连接到与他们相同的IP地址的人…问题来了:我使用映射来存储每个套接字及其对应的伙伴。是否有另一种更快的方式来存储每个套接字和伙伴组合?(对于随机访问,例如查找int[socket]的速度与map方法的速度。){是否使用结构体数组对是我最初的问题,然后我意识到这将是愚蠢的方式…文件描述符并不是每次递增1,所以认为数组可以加快速度是完全没用的}
主观(ish)问题:我想为每个连接存储标志,你认为最好和最容易扩展的方法是将映射对的值(而不是键)转换为持有必要信息的结构体(合作伙伴套接字,连接标志,标志…)还是我应该制作另一个地图,特别是标志成员作为值?内存不是问题。
第三更坚固[&&问题:我正在使用select()函数的FD_Set,并且我已经读到它非常慢,有大量的FD(我知道它可以处理最多1024个,但同样适用于poll())。我该如何实现一个基于事件的系统来监听来自用户的传入数据?(操作系统:ubuntu linux)和它会快多少?我已经对我的服务器进行了压力测试,我可以在网络上处理几百个客户端,而用户端没有明显的减速。我想一次支持3000人以上。
比起花上几个小时读材料,我通过问问题和意识到我将要问多少愚蠢的问题来了解更多…
我将如何去实现一个监听的基于事件的系统来自用户的传入数据?(ubuntu操作系统:linux)和它会快多少?我已经对我的服务器进行了压力测试我能应付几百个跨网络的客户端没有用户的速度明显减慢的一面。我想支持向上的
通常,试图解决c10k问题的人将使用libevent或MTasker提供的事件处理循环。线程化通常会让您在不太麻烦的情况下获得几百个内存,但在某些情况下,内存使用会变得非常受限。基于事件的编程通常可以让服务器扩展到数千台,但这取决于许多因素。
- 并发内存访问减慢系统速度
- 访问静态和堆内存的速度
- 访问std::vector元素的速度会随着向量大小而减慢
- 访问对象的变量会减慢程序速度 (C++)
- 封装的二维数组与普通版本相比——访问速度
- 通过索引访问矢量的速度:向后与向前
- C++加快地图访问速度
- 访问堆栈变量的速度比取消引用指针慢
- 以尽可能快的速度访问数百个文件
- c++是否有一个默认的数据类,用于以合理的速度对基于索引的访问进行排序
- std::map访问速度太慢
- 加快C++堆内存访问的速度
- 矢量访问速度,哪种方法更快
- 特征:访问矩阵4列的速度很慢
- c/c++中访问const变量的速度
- c++ XML解析器(速度,访问DOM树)
- 与普通数组相比,内存访问向量的速度有多快
- 在不同优化级别访问gcc/g++中的局部变量与全局变量的速度
- c++中访问原子变量的速度有多快?
- 存储套接字信息随机访问速度