内存映射文件与命名管道的速度谁快

vegascsu 2012-06-21 10:32:25
我有两个进程,需要进行进程间通信,采用请求/响应的机制。
由于请求/响应的次数,1秒内估计有1万次,现在用的是命名管道,发现速度不行。当然这个时间也跟另一个进程的数据处理时间有关。请问有没有更快的方式,比如内存映射文件是不是更快呢。
...全文
518 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
pathuang68 2012-06-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

响应方确实具有多个线程,估计最大时会有60个线程,我现在是直接用CreateThread来创建线程的。请问这种方法,是不是较慢。是不是你说的线程池会快一些呢。
另外消息队列你是指通信上用消息队列吗?
我试了一下,主要时间浪费在响应方的数据处理上,通信时间很少,数据处理上时间的增加,主要是加入了线程同步,我用的是临界区。不用线程同步,程序就会异常,请问有没有好的解决方案


引用 3 楼……
[/Quote]

1. 就用线程池吧。线程频繁的创建和销毁会需要很多时间,线程池可以避免这个消耗。
2. 你开了60个线程是否太多了?由于线程太多做造成线程同步的消耗也不容小视,还有你的机器上估计也没有60个CPU内核吧?这样密集的运算开再多的线程意义也不大,反而会降低处理速度。
赵4老师 2012-06-21
  • 打赏
  • 举报
回复
共享内存+锁
vegascsu 2012-06-21
  • 打赏
  • 举报
回复
响应方确实具有多个线程,估计最大时会有60个线程,我现在是直接用CreateThread来创建线程的。请问这种方法,是不是较慢。是不是你说的线程池会快一些呢。
另外消息队列你是指通信上用消息队列吗?
我试了一下,主要时间浪费在响应方的数据处理上,通信时间很少,数据处理上时间的增加,主要是加入了线程同步,我用的是临界区。不用线程同步,程序就会异常,请问有没有好的解决方案


[Quote=引用 3 楼 的回复:]

并发处理看行不行啊,
响应方用线程池来处理~~
看消息队列行不?
[/Quote]
vegascsu 2012-06-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

那用共享内存吧, 申请个500M的, 里面建个环形队列, 做一个进程共享mutex+cond, 做lock+cond_wait+cond_brodcast支持多进程并发写多进程并发读,保证无死锁。
[/Quote]

我测了一下,好像确实不是通信的时间问题,主要是我内部数据处理的时间造成的。
由于内部数据处理所在的那个进程,有多个线程,我用的是临界区的线程同步方法,所以造成时间较慢。
你说的这种方法,有没有详细的介绍,或者推荐一下资料看看呀
qq120848369 2012-06-21
  • 打赏
  • 举报
回复
那用共享内存吧, 申请个500M的, 里面建个环形队列, 做一个进程共享mutex+cond, 做lock+cond_wait+cond_brodcast支持多进程并发写多进程并发读,保证无死锁。
pathuang68 2012-06-21
  • 打赏
  • 举报
回复
应该不会更快。内存映射文件通常的目的:用操作内存的方式,操作磁盘文件的,尤其是是针对文件比较大的时候。

直接用共享内存试试吧,如果还不行估计常规的办法就木有了。
jody_go 2012-06-21
  • 打赏
  • 举报
回复
并发处理看行不行啊,
响应方用线程池来处理~~
看消息队列行不?
luciferisnotsatan 2012-06-21
  • 打赏
  • 举报
回复
自己测一下不就清楚了
龙哥依旧 2012-06-21
  • 打赏
  • 举报
回复
just try it !
jackyjkchen 2012-06-21
  • 打赏
  • 举报
回复
命名管道走网络协议栈,速度应该慢些

内存映射擅长随机操作文件,能大大降低操作复杂度,顺序操作的话(不用seek跳来跳去),普通I/O也不麻烦,只是相当于多一层缓冲,效率略低

线程是太多了,尽量用线程池
qq120848369 2012-06-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

响应方确实具有多个线程,估计最大时会有60个线程,我现在是直接用CreateThread来创建线程的。请问这种方法,是不是较慢。是不是你说的线程池会快一些呢。
另外消息队列你是指通信上用消息队列吗?
我试了一下,主要时间浪费在响应方的数据处理上,通信时间很少,数据处理上时间的增加,主要是加入了线程同步,我用的是临界区。不用线程同步,程序就会异常,请问有没有好的解决方案


引用 3 楼……
[/Quote]

响应速度慢造成的队列阻塞必须多线程/多进程并发, 没什么好考虑的.

如果你考虑内存已经承载不了那么大的排队阻塞了, 可以考虑使用开源消息队列, 保证不会因为内存耗尽崩掉, 并且可以持久化避免数据丢失.

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧