- 论坛徽章:
- 0
|
本帖最后由 xhl 于 2011-12-23 13:08 编辑
2.我觉得我那样空等,最多浪费CPU时间,但是不至于性能降低如此多,你说得一批一批得处理,是基于队列空转的考虑么?
这个我觉得你的理解有问题, 你一个其他线程浪费CPU, 就直接导致你的真的需要工作的线程获得CPU的机会小。
假如一段程序如下:
int i = 0;
while (1)
{
i++;
if (i = 100)
{
DoTask();
i = 0;
}
}
你觉得这样的程序性能能理想?我认为你的流水线里很可能有这样类似的情况发生。
我建议你的流水线线程模型应该如下:
while (1)
{
Lock(inputQueue.mutex)
快速得到一批数据从inputQueue里
Unlock(inputQueue.mutx)
if (输入队列里没有数据了) 休息个100毫秒, continue, 或者用条件变量等待
遍历得到这批数据, DoTask();
Lock(outputQueue.mutex)
快速装入一批数据进入outputQueue
Unlock(outputQueue.mutex)
}
这个模型不适合你做的那个循环BUFF队列, 因为你那个有最大值,当一个快一个慢满了的时候不好处理, 就直接用普通的std::list上锁就可以了。
只有多个生产者多个消费者, 上锁对效率影响比较大, 一个生产一个消费, 如果锁用好了, 效率一点都不差。
3.程序是访存密集型的,所以CPU并没有很大的计算量,大部分情况是读内存,写内存,所以我怀疑是访存的影响,但是多进程(把数据都复制一份给
各个进程)并没有如此明显的性能下降(基本上有0.8以上的加速比)。所以想不通,处理的过程中,所有的线程需要访问同一份配置数据,不会有影响吧。
多进程的模式下, 我想你是通过网络或者进程通信的手段来实现的吧。 这个我想区别就在于你没把CPU浪费在无用功上, 因为网络或者进程通信不会像你那样轮训处理。
至于说多个线程访问进程内同一内存, 我觉得只要是只读,不上锁, 这个不会导致严重的性能下降。
Linux下的线程跟进程差别不大。 本质不在这些, 你所说的吞吐就是你相同时间内,你的CPU执行指令周期是总量是固定的, 你到底有多少指令周期做了你影响吞吐的事情。
|
|