第一章 简介
先把事实搞清楚,歪曲是以后的事。
——马克·吐温
我们谈谈I/O吧。别走哇,回来!I/O其实没那么枯燥。输入/输出问题(I/O)虽谈不上多吸引人,却很重要。程序员多半把I/O等同于疏通下水管道:无疑很重要,没有不行,但要是直接跟它打交道,就没那么惬意了,搞不好弄得浑身臭哄哄的。本书要讲的可不是管道疏通,但是阅读了随后章节,您就会知道如何让您的数据流动得稍微顺畅一些。
面向对象的程序设计讲的无非就是封装。封装是个好东西:它分解任务,隐藏实施细节,提高对象的重复利用率。这样的分解、整合既适用于程序,也适用于程序员。您没准是一位技艺高超的Java程序员,创建极其复杂的对象,完成惊世骇俗的任务,而对支撑Java平台的基本I/O概念却几乎一无所知。本章,我们暂且把封装问题抛在一边,先来看看某些底层I/O实施细节,希望有助于您更好地组织协调各个零部件的I/O操作。
1.1 I/O与CPU时间的比较
程序员多半当自个儿是软件大师,设计出精巧的例程,这儿压缩几个字节,那儿解开一个循环,要不就在别处作些调整,让对象更加牢固。这些事情当然很重要,乐趣也不少,但是代码优化所带来的回报,可能轻易就被低效的I/O所抵销。I/O操作比在内存中进行数据处理任务所需时间更长,差别要以数量级计。许多程序员一门心思扑在他们的对象如何加工数据上,对影响数据取得和存储的环境问题却不屑一顾。
表1-1所示为对数据单元进行磁盘读写所需时间的假设值。第一列为处理一个数据单元所需平均时间,第二列为对该数据单元进行磁盘读写所需时间,第三列为每秒所能处理的数据单元数,第四列为改变第一第二列的值所能产生的数据吞吐率的提升值。
表1-1. 处理时间与I/O时间对吞吐率的影响比较
|
处理时间(ms)
|
I/O时间(ms)
|
吞吐率(units/sec)
|
增益(%)
|
5
|
100
|
9.52
|
(基准)
|
2.5
|
100
|
9.76
|
2.44
|
1
|
100
|
9.9
|
3.96
|
5
|
90
|
10.53
|
10.53
|
5
|
75
|
12.5
|
31.25
|
5
|
50
|
18.18
|
90.91
|
5
|
20
|
40
|
320
|
5
|
10
|
66.67
|
600
|
前三行显示了处理阶段的效率提升会如何影响吞吐率。把单位处理时间减半,仅能提高吞吐率2.2%。而另一方面,仅仅缩短I/O延迟10%,就可使吞吐率增加9.7%;把I/O时间减半,吞吐率几乎翻番。当您了解到I/O花在一个数据单元上的时间是处理时间的20倍,这样的结果就不足为奇了。
表中所列并非真实数据,目的只在说明相对时间度量,现实情况绝非如此简单。正如您所看到的,影响应用程序执行效率的限定性因素,往往并非处理速率,而是I/O。程序员热衷于调试代码,I/O性能的调试往往被摆在第二位,甚至完全忽略。殊不知,在I/O性能上的小小投入就可换来可观的回报,想来实在令人惋惜。
1.2 CPU已不再是束缚
Java程序员把全部精力用在优化处理效率上,而对I/O关注不足,在某种程度上讲这并非他们的错。在Java的早期,JVM在解释字节码时往往很少或没有运行时优化。这就意味着,Java程序往往拖得很长,其运行速率大大低于本地编译代码,因而对操作系统I/O子系统的要求并不太高。
如今在运行时优化方面,JVM已然前进了一大步。现在JVM运行字节码的速率已经接近本地编译代码,借助动态运行时优化,其表现甚至还有所超越。这就意味着,多数Java应用程序已不再受CPU的束缚(把大量时间用在执行代码上),而更多时候是受I/O的束缚(等待数据传输)。
然而,在大多数情况下,Java应用程序并非真的受着I/O的束缚。操作系统并非不能快速传送数据,让Java有事可做;相反,是JVM自身在I/O方面效率欠佳。操作系统与Java基于流的I/O模型有些不匹配。操作系统要移动的是大块数据(缓冲区),这往往是在硬件直接存储器存取(DMA)的协助下完成的。而JVM的I/O类喜欢操作小块数据——单个字节、几行文本。结果,操作系统送来整缓冲区的数据,java.io的流数据类再花大量时间把它们拆成小块,往往拷贝一个小块就要往返于几层对象。操作系统喜欢整卡车地运来数据,java.io类则喜欢一铲子一铲子地加工数据。有了NIO,就可以轻松地把一卡车数据备份到您能直接使用的地方(ByteBuffer对象)。
这并不是说使用传统的I/O模型无法移动大量数据——当然可以(现在依然可以)。具体地说,RandomAccessFile类在这方面的效率就不低,只要坚持使用基于数组的read( )和write( )方法。这些方法与底层操作系统调用相当接近,尽管必须保留至少一份缓冲区拷贝。
如表1-1所示,如果您的代码大部分时间都处于I/O等待状态,那么,该考虑一下提升I/O效率的问题了,否则,您精心打造的代码多数时间都得闲着。
1.3 进入正题
操作系统研发人员将大量精力投入到提升I/O性能上。众多高手日以继夜地工作,只为完善数据传输技术。操作系统开发商为了取得竞争优势,投入大量时间、金钱,以便在测试数据上胜过竞争对手。
当今的操作系统是现代软件工程的奇迹(没错,有的比奇迹还奇迹),可是Java程序员如何能够既利用操作系统的强大功能,又保持平台独立性?唉,天下没有免费的午餐,此为一例。
JVM是把双刃剑。它提供了统一的操作环境,让Java程序员不用再为操作系统环境的区别而烦恼。与特定平台相关的细枝末节大都被隐藏了起来,因而代码写得又快又容易。但是隐藏操作系统的技术细节也意味着某些个性鲜明、功能强大的特性被挡在了门外。
怎么办呢?如果您是程序员,可以使用Java本地接口(JNI)编写本地代码,直接使用操作系统特性。这样的话,您就被绑定在该操作系统上(也许还是其特定版本上)。如果您的本地代码不是100%无漏洞,您还可能把JVM置于频繁出错乃至崩溃的境地。如果您是操作系统开发商,则可以在您的JVM实现中包含本地代码,以Java API的形式提供这些特性。但这样做可能违反您所签署相关许可协议,根据协议,您只能提供符合一致性要求的JVM。Sun曾就此问题将Microsoft告上法庭,因为很明显,JDirect软件包只能在微软的系统上运行。如果以上方法都行不通,那么您只好转向其他语言,以实现对性能要求极为苛刻的应用。
为了解决这一问题,java.nio软件包提供了新的抽象。具体地说,就是Channel和Selector类。它们提供了使用I/O服务的通用API,JDK 1.4以前的版本是无法使用这些服务的。天下还是没有免费的午餐:您无法使用每一种操作系统的每一种特性,但是这些新类还是提供了强大的新框架,涵盖了当今商业操作系统普遍提供的高效I/O特性。不仅如此,java.nio.channels.spi还提供了新的服务提供接口(SPI),允许接入新型通道和选择器,同时又不违反规范的一致性。
随着NIO的面世,Java已经为严肃的商业、娱乐、科研和学术应用做好了准备。在这些领域,高性能I/O是必不可少的。
除了NIO,JDK 1.4还包含许多其他重要改进。从1.4版开始,Java平台已进入高度成熟期,它仍无法涉足的应用领域已所剩无几。David Flanagan所著《Java技术手册》(第四版)(Java in a Nutshell, Fourth Edition [O'Reilly])是全面了解JDK 1.4各方面特性的绝佳向导。
分享到:
相关推荐
内容概要:本文详细介绍了无线电能传输技术在电动汽车充电中的应用,特别是在Matlab和Maxwell中的仿真过程。首先讨论了SS补偿拓扑的Matlab仿真,展示了如何设置线圈参数、进行谐振匹配以及通过相量分析判断软开关状态。接着探讨了Maxwell中DD线圈的3D电磁场仿真,强调了自定义网格划分和涡流场计算的重要性。随后,文章深入研究了多线圈阵列仿真,揭示了不同线圈布局对耦合系数的影响,并提出了LCC补偿拓扑的应用。此外,文中还分享了许多实用技巧,如避免常见错误、优化仿真参数以及处理实际测试中的问题。 适合人群:从事无线电能传输研究的技术人员、研究生及以上学历的研究人员。 使用场景及目标:适用于需要深入了解无线电能传输技术及其仿真的研究人员和技术开发者,旨在帮助他们掌握Matlab和Maxwell的具体应用,提高仿真精度和效率。 其他说明:文章不仅提供了详细的代码示例和仿真步骤,还分享了作者的实际经验和教训,使读者能够更好地理解和应对仿真过程中遇到的问题。
用户增删改查功能的前端页面,添加了vue渲染代码。
计算机课程设计相关资源
基于51单片机protues仿真的猜数字游戏(仿真图、源代码、AD原理图、流程图) 猜数字游戏 1、通过随机数实现该游戏; 2、按下K1键启动游戏并随机生成一个0~9的数字 3、通过矩阵按键输入你的数字,输入数字小于随机生成的数字则显示小于该数,大于的时候显示大于该数,直到相等为止。 4、仿真图、源代码、AD原理图、流程图;
内容概要:本文详细介绍了利用MATLAB 2021b搭建的FOC滑膜观测器(SMO)与锁相环(PLL)的仿真模型及其在M4硬件平台上的实现方法。文中首先展示了SMO的核心代码,解释了如何通过滑模面计算和符号函数处理来估算反电动势,并讨论了PLL用于速度提取的具体实现。接着探讨了仿真环境中直接0速闭环启动的效果以及实际硬件实现时所需的开环启动策略。此外,文章还分享了多个调试过程中遇到的问题及解决方案,如相位跳变、高频振荡、电流环参数调整等。 适合人群:从事电机控制研究的技术人员,尤其是对无感FOC感兴趣的工程师。 使用场景及目标:适用于希望深入了解FOC滑膜观测器和锁相环的工作原理并尝试将其应用于实际项目的开发者。目标是掌握SMO+PLL组合的设计思路和技术细节,同时了解硬件移植时需要注意的实际问题。 其他说明:文中提供了大量实用的代码片段和调试经验,对于想要快速入门或优化现有系统的读者非常有帮助。特别强调了仿真与现实之间的差异,提醒读者注意参数选择和滤波器设计等方面的不同之处。
汽车美容员工手册.doc
内容概要:本文详细介绍了利用粒子群优化(PSO)算法解决配电网中分布式光伏系统的选址与定容问题的方法。首先阐述了问题背景,即在复杂的配电网环境中选择合适的光伏安装位置和确定合理的装机容量,以降低网损、减小电压偏差并提高光伏消纳效率。接着展示了具体的PSO算法实现流程,包括粒子初始化、适应度函数构建、粒子位置更新规则以及越界处理机制等关键技术细节。文中还讨论了目标函数的设计思路,将多个相互制约的目标如网损、电压偏差和光伏消纳通过加权方式整合为单一评价标准。此外,作者分享了一些实践经验,例如采用前推回代法进行快速潮流计算,针对特定应用场景调整权重系数,以及引入随机波动模型模拟光伏出力特性。最终实验结果显示,经过优化后的方案能够显著提升系统的整体性能。 适用人群:从事电力系统规划与设计的专业人士,尤其是那些需要处理分布式能源集成问题的研究人员和技术人员。 使用场景及目标:适用于希望深入了解如何运用智能优化算法解决实际工程难题的人士;旨在帮助读者掌握PSO算法的具体应用方法,从而更好地应对配电网中分布式光伏系统的选址定容挑战。 其他说明:文中提供了完整的Matlab源代码片段,便于读者理解和复现研究结果;同时也提到了一些潜在改进方向,鼓励进一步探索和创新。
晋升考核制度.pptx
计网-主机发送IP数据报的过程思维导图
内容概要:本文详细介绍了三菱FX3U PLC与三台三菱E740变频器通过Modbus RTU协议进行通讯的具体实现方法。主要内容涵盖硬件配置(如PLC、变频器、触摸屏)、通讯参数设置(如波特率、数据位、校验方式)、PLC程序编写(包括初始化、启停控制、频率设定等)、触摸屏编程(如画面设计、变量关联)等方面。文中还分享了一些实际应用中的注意事项和避坑指南,确保通讯系统的稳定性和可靠性。 适用人群:从事工业自动化领域的工程师和技术人员,尤其是熟悉三菱产品和Modbus RTU协议的专业人士。 使用场景及目标:适用于需要实现PLC与多台变频器通讯的工业自动化项目,旨在提高系统的集成度和可控性,减少人工干预,提升生产效率。 其他说明:文中提供的实例和代码片段有助于读者快速理解和掌握相关技术要点,同时强调了实际操作中的常见问题及其解决方案。
内容概要:本文深入探讨了利用二/三自由度动力学模型和MPC(模型预测控制)实现自动驾驶车辆的任意路径跟踪技术。首先介绍了二自由度动力学模型的基本概念及其状态方程,随后详细解释了MPC的工作原理,包括目标函数的设计和优化求解过程。接着讨论了Carsim和Simulink联合仿真的具体实施步骤和技术要点,如采样同步、约束条件处理等。文中还分享了许多实用的工程经验和调试技巧,例如预瞄距离的设置、权重矩阵的选择以及如何应对高速工况下的挑战。最终通过仿真结果展示,证明了该方法的有效性和优越性。 适合人群:从事自动驾驶研究与开发的专业人士,尤其是对路径跟踪算法感兴趣的工程师和技术爱好者。 使用场景及目标:适用于需要精确路径跟踪的自动驾驶应用场景,旨在提高车辆行驶的安全性和效率。通过掌握本文介绍的方法和技术,可以帮助开发者更好地理解和实现基于MPC的路径跟踪系统。 其他说明:文章不仅提供了理论知识,还包括了大量的实战经验和代码片段,有助于读者快速上手并应用于实际项目中。同时强调了在不同速度范围选择合适自由度模型的重要性,为后续的研究和发展指明了方向。
内容概要:本文详细介绍了基于西门子S7-1200 PLC的智能灌溉系统的设计与实现。系统主要包括PLC控制器、触摸屏、传感器和执行机构。文中详细讲解了如何使用博途V16软件编写PLC程序,包括梯形图编程和SCL语言的应用,以及如何设计触摸屏监控画面。此外,还涉及了IO表和电气原理图的准备,确保系统的正确安装和维护。文章特别强调了自动灌溉的核心逻辑,如状态机结构和异常处理机制,以及触摸屏设计的小技巧,如动态图标和趋势图的使用。最后,提供了调试过程中的一些注意事项和优化建议。 适合人群:从事农业自动化领域的工程师和技术人员,尤其是熟悉PLC编程和触摸屏设计的专业人士。 使用场景及目标:适用于需要提高灌溉效率和精度的现代农业生产环境。目标是通过智能化控制减少水资源浪费,提升作物产量。同时,也为系统开发者提供了详细的实施指南和调试技巧。 其他说明:文章附带了完整的PLC程序、HMI界面和电气图纸,方便读者进行实际操作和验证。
国金qmt模拟客户端。 模拟账号密码,私聊。
员工离职面谈记录表.doc
新员工关怀方案
内容概要:本文详细介绍了轴承表面缺陷检测数据集的结构及其应用方法。数据集包含5824张高清轴承图像及其对应的XML标注文件,涵盖擦伤、凹槽、划痕三种类型的缺陷。作者通过Python代码展示了如何检查数据完整性、解析XML标注文件、进行数据可视化以及数据增强操作。此外,还讨论了使用YOLOv5和EfficientDet等模型进行缺陷检测的具体步骤和技术要点,强调了高分辨率图像处理和模型优化的方法。 适合人群:从事工业质检、机器视觉、深度学习等相关领域的研究人员和工程师。 使用场景及目标:适用于需要处理高分辨率工业图像并进行缺陷检测的研究和工程项目。主要目标是提高缺陷检测的准确性,特别是在复杂的工业环境中。 其他说明:文中提供了大量实用的Python代码片段,涵盖了从数据预处理到模型训练的各个环节。特别提到了针对金属表面反光、多缺陷共存等问题的技术解决方案。
招聘甘特图.xlsx
招聘仪表盘构建及为数据解读P11.pptx
内容概要:本文详细介绍了利用MATLAB进行光纤通信物理层传输算法仿真的方法和技术要点。主要内容涵盖色散补偿、非线性放大器建模、信号重构、时钟恢复、QPSK调制、误码率分析等方面。文中提供了多个具体的MATLAB代码示例,如色散补偿、非线性放大器特性拟合、QPSK调制与解调、眼图生成等,并分享了许多调试经验和常见问题解决方案。此外,作者还强调了仿真过程中需要注意的关键细节,如参数设置、变量监控、噪声注入方式等。 适合人群:从事光纤通信研究的技术人员、研究生以及对通信系统仿真感兴趣的开发者。 使用场景及目标:适用于希望深入了解光纤通信物理层传输机制及其仿真实现的研究人员和工程师。目标是帮助读者掌握MATLAB在通信仿真中的应用,提高仿真效率并减少调试时间。 其他说明:文章不仅提供详细的代码示例,还分享了大量实战经验,有助于读者快速上手并解决实际问题。
线性代数