月度归档:2022年04月

QLocalSocket和QTcpSocket混用,会影响QTcpSocket的性能吗?

Qt的LocalSocket是基于PIPE实现的,且PIPE的缓冲区被设置为0。

为什么被设置为0呢?它文档说是数据在管道没有被关闭前取出,会导致数据丢失,故在创建时设置其缓冲区为0。那它是如何优化性能呢?它是利用OVERLAPPED_COMPLETION_ROUTINE的能力实现的。无限异步调用ReadFileEx(PIPE),当数据到达缓冲区后,取回数据又再调用,从而实现数据的快速读取。写入数据呢?也是相似的方法。

那它与QTcpSocket混用是否会影响性能吗?在实际P2P模式压测试下,PIPE的传输效率为每秒5M字节左右,QTcpSocket为14M字节,这压测是在发送1M数据回复一个ACK然后再发送1M数据下取得的结果。

QTcpSocket虽效率高,但占用CPU也相应高,QLocalSocket虽然是低很多,但CPU占用低。
在实际的复杂的网络环境下,其也满足使用。

Qt的QLocalSocket性能高吗

Qt的LocalSocket在Window中是基于Pipe实现的,而Linux中是基于UnixSocket实现的。
按说pipe的性能是不错的,但Qt比较坑,它的内部缓冲区是0,故形成一个阻塞操作,再加上是基于Event事件唤醒,性能整体就比较低下,没有Socket的高。
此事件的使用是与窗口消息共用同一个线程的,为了不影响其它消息的正常处理,它采用WaiForMutipleObject的方法,但等待时间为0,故会出现缓慢。
那Linux呢,是否可以使用呢?也不建议使用,原因是它的缓存只有64K,小数据传送,其效率是比较高的,但大数据传输时,就会出现阻塞的情况,这也影响的整体性能表现。