JAVA高并发服务器讨论
开发WEB, Buffer几乎必不可少.
但假如采用自增加长度的Buffer, 单纯写4MB的数据, 都要350ms的时间, 效率这么低.
从SOCKET下来的数据, 先是写到Buffer, 然后处理完成后, 再把结果写入Buffer, 然后用SOCKET发送出去.
在这一来一回的过程当中, 存在两次缓冲写入和读取, 就算不计算读出的时间, 单纯流入流出4MB, 就花掉700ms了, 那么1秒内, 只剩下300ms是业务处理的时间, 这么低的效率, 怎样提高并发量啊...
各位写高效WEB时, 都使用什么方法增加数据流量的?
[解决办法]
帮顶下~~~
[解决办法]
这个350ms的时间,是怎么来的,需要看看瓶颈在哪里,是硬盘IO还是网络IO。
[解决办法]
高并发你不能用java自带的socket,自带的socket是阻塞式的,效率低。无法满足WEB类型的高请求服务。必须用非阻塞式TCP/IP通信模式
[解决办法]
俺搞c的,没了解过java的ByteArrayOutputStream 是怎么实现的,估计问题在这里。
它的底层实现估计每次都会进行一些诸如strlen或者memset之类的操作,导致对大缓存的性能下降。
可以:
1、看看源码是否有类似的问题
2、搞一个小一点的buffer,加一层循环,比如4K的buffer,再加一个1K的外层循环试试看
如果有问题,可能要考虑换封包的方式,或者换buffer类了
纯属猜测,仅供参考
话说你这么大的缓冲,用来做什么?瞬间发这么大流量,网卡还不被你撑死,1秒时间700ms网卡都空闲的,有点浪费了,最好能均匀使用网卡:)
[解决办法]
我的笔记本CPU是T8300,运行代码用了170-200ms
先定义 byte[] buf11 = "测试字符串1号".getBytes();再写buf11 ,执行时间是60-70ms
循环中做getBytes()转换,开销相当很高
[解决办法]
@dfasri:
我了解你的意图。不过还是要说明,问题可能出在我说的那个地方。建议你测试一下,确定是不是这个问题。
我说的第2种方式,可能没讲清楚,就是希望能通过减小缓冲的方式加快速度,原因如下:
java用什么buffer不太清楚,C里面对char数组的不同使用方法也会导致效率出现严重的区别。
比如用strncpy来拼接字符串,在目标buffer很大时,效率会急剧下降,原因是这个函数对buffer的未使用部分循环做了fill 0。
[解决办法]
帮顶下
[解决办法]
jvm currentTimeMillis是不准的 好像最小感知时间是15ms左右 纳秒感知时间是800ns左右空转试试就知道 “4M的写入要花掉上百毫秒” 这个明显有问题 硬盘的响应速度也不止这样吧
抛开这些不说 如果在意响应速度多加些线程就就可可以了吧