据Sun自己说,在JDK7中,异步IO比同步IO性能大约有5%~10%的提升,此外,异步IO模式比同步IO模式更健壮。本来本人对Java的网络的性能就是持怀疑态度的,不管怎么说,怀疑归怀疑,在下结论之前,还是要拿出些证据的,废话不多说,写几片代码,来测试测试JDK7的异步IO和同步IO的性能。到底表现如何?
基本测试环境:
服务器:
CPU AMD5000+
内存 2G
网络 100Mbps
OS Redhat AS5 64bit (此环境运行在虚拟机上)
客户端:
CPU Core P8400
内存 6G
网络 100Mbps
OS Windos XP Pro English 32bit
测试方法:服务器端的接收程序分为异步IO通讯方式和同步IO通讯方式,客户端统一采用多线程异步IO通讯方式向服务器段写一个大小为20,788,639字节的文件,线程开始之前开始计时,客户端所有线程结束后,计结束时间,两个时间点差值计为本次测试文件传输的耗用时间。以10,20,50,100,200,300这6个基准线程测试,每个基准测试4~6次,统计平均时间。
同步网络IO
32K发送缓冲区和接收缓冲区,测试的结果如下:
线程数 |
平均时间
MS
|
单个文件消耗时间
MS
|
吞吐量
MB/S
|
网络利用率
|
20 |
36,273.3 |
1,813.67 |
10.931 |
91.70% |
50 |
92,439.7 |
1,848.79 |
10.724 |
89.96% |
100 |
235,694.7 |
2,356.95 |
8.412 |
70.56% |
同步网络IO,512K发送缓冲区和接收缓冲区,测试的结果如下:
线程数 |
平均时间MS |
单个文件消耗时间
MS
|
吞吐量MB/S |
网络利用率 |
10 |
19,480.8 |
1,948.08 |
10.177 |
85.37% |
20 |
36,383.3 |
1,819.16 |
10.898 |
91.42% |
50 |
93,531.3 |
1,870.63 |
10.598 |
88.91% |
100 |
183,011.8 |
1,830.12 |
10.833 |
90.87% |
200 |
568,086.0 |
2,840.43 |
6.980 |
58.55% |
性能比较:虽然测试不是很完全,但是可以看得出,使用512K缓存取得了比较好的性能,之后的分析结果是在发送时读取文件,和接收时写入文件,大的缓存有利于减少文件IO操作。对整个系统性能提高起到了关键的作用。
当线程数达到200个时,客户端出现了丢连接的情况。最少的丢1个,最多的丢16个。
异步IO
32K不完全测试结果
线程数 |
平均时间MS |
单个文件消耗时间
MS
|
吞吐量MB/S |
网络利用率
|
100 |
315,328.3 |
3,153.28 |
6.287 |
52.74% |
200 |
783,781.2 |
3,918.91 |
5.059 |
42.44% |
300 |
1,375,141.0 |
4,583.80 |
4.325 |
36.28% |
512K缓存完全测试结果
线程数 |
平均时间MS |
单个文件消耗时间
MS
|
吞吐量MB/S |
网络利用率
|
10 |
21,023.5 |
2,102.35 |
9.430 |
79.11% |
20 |
36,312.8 |
1,815.64 |
10.919 |
91.60% |
50 |
94,179.8 |
1,883.60 |
10.525 |
88.29% |
100 |
186,320.3 |
1,863.20 |
10.641 |
89.26% |
200 |
576,215.0 |
2,881.08 |
6.881 |
57.72% |
300 |
883,484.3 |
2,944.95 |
6.732 |
56.47% |
从结果里可以看出,性能最好的表现是在50,100这两个测试点,200后,性能有明显下降。但是,比32K有很大提高,相对于同步的IO,基本上持平,但是在300个线程测试点上,4次测试全部通过,没有出现丢连接的情况。因此,异步IO比同步IO的稳定性要高很多。
所有的测试结果中都显示,100线程后,网络IO出现了明显的下降,事后的分析认为可能是测试的客户端多线程在运行过程中出现了频繁的上下文切换。
本次测试的结论:异步IO比同步IO稳定健壮,性能提高不明显。看来Netty,Mina这些框架要开始考虑使用异步IO咯。
如果你有好的测试网络环境并对这个测试感兴趣,请联系我!
分享到:
相关推荐
1. 同步IO与异步IO: - **同步IO**:在同步模式下,应用程序执行I/O操作时会等待操作完成。这意味着程序在数据传输期间被挂起,直到数据准备就绪或传输完毕。例如,Java的`InputStream`和`OutputStream`类的读写...
JAVA IO同步、异步详解 IO 操作是计算机系统中最基本的操作之一,它可以分为同步(Synchronous)和异步(Asynchronous)两种模式。同步IO 是指应用程序在执行IO 操作时,需要等待IO 操作完成后才能继续执行其他操作...
同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non...
同步IO和异步IO的主要区别在于如何处理数据传输时的等待时间。在同步IO中,当一个进程发起IO操作时,它会直接等待操作完成,这期间CPU会处于空闲状态,直到数据准备好才能继续执行后续代码。这种方式简单易懂,但...
- **使用场景**:适用于复杂的异步编程场景,如异步IO操作、异步网络请求等。 #### 四、案例分析 以下是一个简单的synchronized关键字使用的示例: ```java package test.thread; public class SynTest { // ...
总之,基于异步IO的socket通信程序设计是一种高效处理网络连接的技术,它可以极大地提高系统的并发能力,适应大规模用户访问的需求。通过抽象的socket通信、字符串传输以及对象的序列化,我们可以构建出强大且灵活的...
《Java异步IO框架Cindy深度解析》 在Java编程领域,异步I/O(Asynchronous Input/Output)已经成为高性能网络应用开发的关键技术之一。它允许程序在等待数据准备就绪时执行其他任务,显著提高了系统资源利用率和...
- 异步IO(AIO):用户进程发起IO请求后可以继续执行其他任务,一旦数据准备好,内核会直接将数据复制到进程空间并通知进程。 5. Java IO类库 Java IO类库主要包含字节流和字符流两大类。字节流通常用于处理二进制...
Java异步编程框架Promise是用于处理异步操作的一个重要工具,尤其在Java中,Promise的概念被广泛应用于多种场景下进行高效的数据处理和结果获取。Promise框架主要作用在于简化异步编程模型,使其更加易于理解和使用...
Java Swing、IO与Util是Java编程中的核心模块,它们各自承担着不同的功能并相互协作,为开发者提供了强大的工具集。让我们深入探讨这些知识点。 Swing是Java AWT(Abstract Window Toolkit)的扩展,用于构建图形...
总结来说,Java中处理图片上传和回显涉及的技术点包括:使用MultipartFile处理文件上传,理解同步与异步的区别,运用WebFlux或AsyncController实现异步处理,提供图片的RESTful API,以及前端的Ajax请求和图片显示。...
7. **异步IO(NIO)** Java的非阻塞I/O模型,如`java.nio`包,允许在等待I/O操作时释放CPU资源。配合`Selector`和`Channel`,可以高效处理多个输入/输出流,尤其适用于高并发的网络应用。 8. **异步库与框架** ...
OkHttp提供了异步和同步两种API,支持连接池,能够显著提高网络操作的性能和可靠性。在Socket.IO中,OkHttp可能被用作WebSocket或其他HTTP通信的基础。 2. **engine.io-client-0.8.3.jar**:Engine.IO是Socket.IO的...
Java IO模型1主要涉及到的是Java在处理网络数据交互时的不同方式。这里有五种主要的IO模型,它们分别是阻塞IO(BIO)、非阻塞IO、IO...对于高并发、高效率的网络应用,通常会选择非阻塞或异步IO模型,以提高系统性能。
与传统的同步IO不同,NIO采用了基于通道和缓冲区的模型,使得程序能够在没有数据可读写的情况下继续执行其他任务,从而提高了系统的吞吐量和响应能力。 - **通道(Channel)**:通道是Java NIO中的核心组件之一,它是...
四、同步IO和异步IO 同步IO是指在IO操作过程中,一个事件或者任务的执行会导致整个流程的暂时等待。异步IO是指在IO操作过程中,一个事件或者任务的执行不会导致整个流程的暂时等待。 五、五种IO模型 IO模型有五种...
1. **异步IO**:在多线程环境中,一个线程负责读取数据,另一个线程处理数据,这样可以实现读写操作的并行,提高程序效率。 2. **线程安全的IO**:在并发环境下,要确保IO操作的线程安全,例如使用`synchronized`...
在 Java 中,IO 模型主要有五种:同步阻塞 IO、同步非阻塞 IO、I/O 多路复用、信号驱动 IO 和异步 IO。其中,BIO 属于同步阻塞 IO 模型,NIO 属于 I/O 多路复用模型。 同步阻塞 IO 模型中,当应用程序发起 read ...
Java中的IO(输入/输出)和线程是两个核心概念,它们在开发高效、响应性强的应用程序时起着至关重要的作用。输入/输出处理数据的传输,而多线程则涉及程序的并发执行。 首先,让我们深入理解Java的IO系统。Java.IO...