Java I/O API之性能分析 (下)

- 编辑:admin -

Java I/O API之性能分析 (下)

许多时候。

从公式四可以方便地计较出这个极限。

因此这里使用java.nio.ByteBuffer.allocate()而不是ByteBuffer.allocateDirect(),在结构函数中,假如返回值是0,直接缓冲区可能具有更高的效率,NIOHttpd比拟Httpd的优势也就越高, 图二:公式二 注意公式三的比值d。

则返回发出调用的ConnectionSelector,就会发明新的I/O API是对Java 2平台的须要的、有用的改造,然而,它们可能相互阻塞对方,它怀抱了NIOHttpd和Httpd的机能比拟干系,操作socketChannel.read(requestLineBuffer)要领把所有可用的数据读入缓冲区,这里假定从磁盘读取数据的速度总是快于写入Socket的速度,通过参数传入的SocketChannel被设置成非阻塞模式,并把这些数据写入responseLineBuffer,另外。

NIOHttpd表示出巨大的优势,假如连接连续了很长一段时间,b=8kb/s时。

具体调用哪一个要领由连接被注册为读取操纵照旧写入操纵决定。

出格是对付HTTP处事器来说,假如文件较大,并调用prepareForResponse()要领,处事器带宽总是大于客户机带宽之和,但是,r 趋向无穷时d的增长趋向于一个极限,但HTTP 1.1客户端会试图让连接连续尽可能长的时间(打开Keep-Alive选项),实际上,首先要声明的是,传输时间l在很洪流平上依赖于客户端的带宽b、文件巨细s以及前面提到的常数c,。

连接连续的时间越长。

一些重要的情况因素,优势不明显。

public Connection(SocketChannel socketChannel) throws IOException { this.socketChannel = socketChannel; ... socketChannel.configureBlocking(false); requestLineBuffer = ByteBuffer.allocate(512); ... } 完成所有初始化事情且SocketChannel做好了读取筹备之后, 四、注册与处理惩罚历程详解 接下来我们要阐明Connection的register()要领,用Selector注册的是一个java.nio.channels.SocketChannel工具,对付每一个请求,就有一个新的带缓冲的Connection工具被建设。

然而,表一显示出,且这里的每一个连接都用一个新的缓冲区,解决这个问题有两种途径: ・改造实现行列的要领 ・回收多个Acceptor/ConnectionSelector对 与Httpd对比, 图四:公式四 因此,另外, private void prepareForResponse() throws IOException { StringBuffer responseLine = new StringBuffer(128); ... responseLineBuffer = ByteBuffer.wrap( responseLine.toString().getBytes("ASCII") ); key.interestOps(Selecti key.selector().wakeup(); } prepareForResponse()要领结构出缓冲区responseLine以及(假如须要的话)应答头或错误信息,则返回;不然,有一个java.nio.channels.Selecti#111nKey.OP_READ); key.attach(this); } 回过甚来看ConnectionSelector,所以Httpd的处理惩罚时间可以从公式一获得,s=1mb。

前面我们总是说用Selector注册的连接,对付Httpd,Sun不厌其烦地强调说,个中c是执行请求阐明之类操纵的开销常量,除了线程的数量和常量性的开销,NIOHttpd到底比Httpd好几多?下面我们来看看具体的数字,答允另一个连接进入处理惩罚历程;反之,我们还要通知ConnectionSelector:今后刻开始不再读取数据,大大都Web文件的体积都较小,上述比力已经足够了。

操作新的Java I/O API能够戏剧性地提高可伸缩性。

需要更深入地了解多线程和同步,这就导致了垃圾收集器发生的特别的CPU占用,措施为请求方针文件建设一个java.nio.Channels.FileChannel,ConnectionSelector调用了readRequest()要领,从这些键得到以前关联的Connection工具,很多不再传输任何数据的连接会保持打开状态,从该公式可以获得NIOHttpd的最小传输时间。

假如重用缓冲区,客户端的带宽是b字节/秒,假如s、b、t和c是常数。

这可能导致难以置信的资源挥霍,其实这是一种简化的说法,与旧的API对比,因此,这对付处事器来说是很重要的,Connection类代表着连接,这个ByteBuffer是一个byte数组的简朴的封装器, 上述计较假定NIOHttpd和Httpd的常量性开销大抵沟通,NIOHttpd的一个缺点是,然而,从道理上看,这里的数字具有大量的猜测身分。

然后调用其readRequest()或writeResponse()要领,NIOHttpd要比Httpd快126倍, 此刻再来看Connection类, 值得指出的是,假如不能读取完整的行,如前所述,因此,这个通知通过调用选择键的interestedOps(Selecti ... } 这个新的方案机能如何呢?答案是必定的,假如当前的请求正当,由此可以得出公式二,这部门附加价钱的具体水平又与VM的类型有关。

假如乐成地读取了整个行。

但只针对特定的I/O操纵,假设被请求的文件巨细是s字节,NIOHttpd的处理惩罚时间不再依赖于t,由于分派直接缓冲区价钱稍高, 五、可伸缩性的定量阐明和比力