使用Unsafe真的是关于速度或功能吗?

总览

大约6年前,我开始使用一个类,直到那时,它只是一个好奇心sun.misc.Unsafe 。 我曾使用它进行反序列化和重新抛出Exception,但没有使用它的全部功能或公开谈论它。

我看到的第一个严重使用Unsafe的开源库是Disruptor。 这使我感到鼓舞,它可以在稳定的库中使用。 大约一年后,我发布了我的第一个开源库SharedHashMap(后来的Chronicle Map)和Chronicle(后来的Chronicle Queue)。 这使用Unsafe来访问Java 6中的堆外内存。这对堆外内存的性能产生了真正的影响,但更重要的是,我可以使用共享内存来做。 即跨JVM共享的数据结构。

但是今天有什么不同呢? 使用不安全总是更快吗?

我们正在寻找引人注目的性能差异。 如果差异不那么明显,则使用尽可能简单的代码更有意义。 即使用自然的Java。

测试

在这些测试中,我对源自堆外内存的数据进行了简单的累积。 这是一个简单的测试,它对解析数据(或哈希数据)建模,这些数据是从堆(例如,TCP连接或文件系统)中生成的。 数据大小为128个字节。 下面的结果可能受数据大小的影响,但这被认为具有代表性。

我看的是不同大小的访问,一次访问一个字节,一次int或一次long。 我还研究了使用ByteBuffer还是在堆上复制数据并使用自然Java(我假设这是大多数程序执行此操作的方式)。

我还比较了使用Java 6更新45,Java 7更新79,Java 8更新51的情况,以查看不同版本之间使用不同方法的方式。

逐字节处理

处理器设计中真正改善的一点是它可以复制大型数据块的速度。 这意味着复制大量数据,以便可以更有效地处理它是有意义的。 也就是说,冗余副本可能足够便宜,从而可以带来更快的解决方案。

逐字节处理就是这种情况。 在此示例中,“在堆上”包括在处理之前在堆上复制数据的副本。 这些数字是在i7-3790X上每微秒的操作数。

Java 6 Java 7 Java 8
字节缓冲区 15.8 16.9 16.4
不安全 17.2 17.5 16.9
在堆上 20.9 22.0 21.9


这样做的重要意义在于,“堆上”不仅使用自然Java,而且在所有三个版本的Java中都是最快的。最可能的解释是,JIT具有在堆上情况下可以进行的优化。如果您直接或间接使用不安全,则不会这样做。

由int处理int。

解析详细的有线协议的更快方法是一次读取一个int。 例如,您可以通过一次读取一个int而不是单独查看每个字节来编写已知格式的XML解析器。 这样可以将解析速度提高2到3倍。 这种方法最适合已知结构的内容。

Java 6 Java 7 Java 8
字节缓冲区 12.6 36.2 35.1
不安全 44.5 52.7 54.7
在堆上 46.0 49.5 56.2


同样,这是i7-3790X上每微秒的操作。 有趣的是,在复制后使用自然Java大约与使用Unsafe一样快。 对于此用例,也没有令人信服的理由使用Unsafe。

长期加工

虽然您可以编写一个解析器一次读取一个64位长的值,但我发现这比使用32位int值解析要困难得多。 我也没有发现结果要快得多。 但是,只要设计散列算法时就考虑到了这一点,则对散列数据结构进行散列可以受益于读取​​长值。

Java 6 Java 7 Java 8
字节缓冲区 12.1 56.7 53.3
不安全 66.7 83.0 94.9
在堆上 60.9 61.2 70.0


有趣的是,使用ByteBuffer的速度提高了多少。 最可能的解释是在ByteBuffer中增加了将little-endian交换为默认big-endian的优化。 x86有一条交换字节的指令,但是我怀疑Java 6没有使用它,而是使用了更昂贵的移位操作。 为了能够确认这一点,将需要进行更多测试并检查生成的汇编代码。

在这种情况下,使用“不安全”的速度始终更快,无论您是否认为这种改进值得直接使用“不安全”的风险是另一回事。

补充笔记

这些测试假设使用字节,整数或长整数的统一数据类型。

在大多数实际情况下,这些数据类型是结合在一起的,这就是在堆上挣扎的地方。 例如,如果您需要解析字节,短裤,整数,长整数,浮点数,双精度数的任意组合。 ByteBuffer是执行此操作的好方法,但是在每种情况下,它都是最慢的选项。 只有不安全才能让您灵活地混合和匹配类型,而不会产生开销。

对于这些混合类型,很难对堆进行公平的测试,因为自然Java不直接支持这些操作。

结论

即使性能是您最关心的问题,在某些情况下,自然Java的性能还是更好,或与使用Unsafe一样快。 它经常执行ByteBuffer,因为JIT可以更好地优化开销,例如对自然Java代码进行边界检查。

自然的Java代码依赖于我们可以将数据建模为byte [],int []或long []的事实。 没有数组或原始类型混合的选项。

自然Java挣扎的地方在于对这两种方式的支持

  • 不同原始类型的任意组合,例如字节,整数,长整数,双精度数。
  • 共享/本机内存上的线程安全操作。

不幸的是,由于缺乏自然Java支持,因此很难创建公平的基准来比较性能。

总之,如果您可以用自然Java实现算法,则它可能是最快也是最简单的。 如果您需要混合使用数据类型或线程安全堆来解析数据,那么仍然没有很好的方法来使用自然Java。

注意:这是Java 9中的VarHandles应该能够提供帮助的区域,因此请观看此空间以获取VarHandles的更新。

翻译自: https://www.javacodegeeks.com/2015/08/is-using-unsafe-really-about-speed-or-functionality.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/357615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css全局设置

/***** 全局设置 *****/body,h1,h2,h3,h4,h5,h6,p,form,ul,ol,li,dt,dl,dd,th,td,label,bottom,input,textarea{ margin:0;padding:0;}body{font-family:"宋体", arial;font-size:12px;line-height:1.5;text-align:left;background:#FFF;color:#000;}h1,h2,h3,h4,h5,…

MyEclipes+JSP+tomcat+MySQL实现JavaEE平台项目管理系统

导读:随着社会信息化的发展,很多的社会管理问题也一并出现了根本性变化,项目公司的报表及文件管理也发生了变化,以前的管理是一个分布式的信息,然后围绕中心由通过简单的来传输信息,这使得办事效率非常低下,所以需要需要适用信息货的发展,开发一套项目的管理信息系统。…

可以升级oracle版本吗,怎么升级oracle版本

Oracle数据库升级也并非简单的事,这篇文章对Oracle那点事做了较详细的介绍:Oracle数据库升级或数据迁移方法研究我还属于Oracle的菜鸟,就不献丑介绍了。下面我就简单总结下,Oracle同版本升级的经历:升级数据库:1. 先检查数据库当前…

Mac OS X下安装nvm的方法

最近准备学习一下node.js,到youtube上搞了些视频回家看。结果在ubuntu上面安装nvm都ok了,坑货mac搞不定。 经过不断尝试,google,youtube,终于发现了如何搞定。现特将步骤记录,聊以自慰。 安装node.js原本需…

Myesclipe+SSH+jsp+mysql+tomcate实现一个简单的CRM客户关系管理系统

导读: CRM客户关系管理系统的目的通过客户管理,产品管理,系统管理等功能同客户建立联并收集客户信息,此基础上满足客户"一对一"个性化服务。同时信息在企业的流程上得以流转,让客户得到高效的,满意的服务。本系统包括信息管理、客户管理、产品管理等多项功能。…

adf平稳性检测_ADF声明性组件示例

adf平稳性检测在我以前的文章中,我答应展示如何为智能值列表创建ADF声明性组件。 因此,我将创建一个包含三个元素的组件:标签,输入文本和值的组合框列表。 那很容易。 我在工作空间中创建了一个单独的ADF ViewController项目&…

oracle 计算中位数,SQL 如何计算每个分组的中位数

中位数是指一组数据排序以后,位于中间位置的数据值。如果数据个数是奇数,中位数就是最中间位置那个值;如果是偶数,则是中间位置那两个数的平均值。怎么查询出数据分组以后每个组的中位数呢?用SQL来解决这个问题是很有难…

OA学习笔记-006-SPRING2.5与hibernate3.5整合

一、为什么要整合 1&#xff0c;管理SessionFactory实例&#xff08;只需要一个&#xff09; 2&#xff0c;声明式事务管理 spirng的作用 IOC 管理对象.. AOP 事务管理.. 二、整合步骤 1.整合sessionFactory 在applicationContext.xml添加 1 <!-- 导入外部的properties文件 …

JSP+Tomcat+SQL Server 2000+JDBC实现合同信息管理系统

导读:随着信息科学技术的飞速发展,人们逐渐意识到对信息管理软件的运用可以使日常工作更加方便、快捷和高效。论文详细论述了公司合同管理系统的开发设计过程。软件采用JSP开发技术,Tomcat作容器, SQL Server 2000作数据库管理系统,实现了创建合同、修改合同、删除合同、合…

使用Chronicle Wire将YAML连接到文件或网络

总览 Chronicle Wire旨在在简化开发和加快调试方面获得文本协议的好处&#xff0c;但能够在不更改代码的情况下切换到性能更高且更小的二进制协议。 在这篇文章中 &#xff0c;我研究了使用基于YAML的文本格式进行序列化&#xff0c;反序列化可能会实现的性能。 不错的功能之一…

JSP+JDBC+XML+mysql实现企业电子投票系统

导读:企业电子投票系统主要用来统计网站用户对某个主题或热门话题的意见。决策者通过这些统计数据做出相应的决策。企业电子投票系统是一般网站必备的程序之一,如果网站开发者想了解用户对该网站的意见和建议。他可以设计这样一个投票主题:你认为该网站如何?(A.很好 B.一般…

冒泡排序算法。

冒泡排序算法 题目&#xff1a; 给定7个int类型的数&#xff0c;用冒泡排序实现出来。 code: public class Maopaopaixu { public static void fun() { int arr[] {9,8,6,1,5,3,2}; System.out.println("数组排序前的顺序为:"); for(in…

matlab 无向拓扑图,无向图绘画树状拓扑图算法

基于目前Network项目需要&#xff0c;研究相关树形算法该需求难点如下&#xff1a;1、目前拓扑图是无向图&#xff0c;而树大多数都是基于有向图来画的&#xff0c;无法确定根节点2、网络拓扑中存在回环问题&#xff0c;导致链路可能会存在重叠问题针对问题1&#xff0c;目前根…

Java Mail+MYSQL+Tomcate+jsp实现企业快信系统

导读:首先对企业快信的开发进行了较深入的研究,然后对短信发送与邮件发送原理进行了介绍,接下来对系统的概要设计、功能模块、数据库设计,以及名片夹管理功能与邮件发送功能的具体实现作了细致阐述,最后是系统效果的展示。企业快信系统是一个集短信与邮件为一体的移动商务…

SQL存储过程分页(通用的拼接SQL语句思路实现)

多表通用的SQL存储过程分页 案例一&#xff1a; USE [Community] GO/****** Object: StoredProcedure [dbo].[Common_PageList] Script Date: 2016/3/8 13:44:58 ******/ SET ANSI_NULLS ON GOSET QUOTED_IDENTIFIER ON GOCREATE PROCEDURE [dbo].[Common_PageList] ( tab …

odbc连接oracle失败,大神解答win7系统ODBC无法连接ORACLE的处理方案

随着电脑的使用率越来越高&#xff0c;我们有时候可能会遇到win7系统ODBC无法连接ORACLE问题&#xff0c;如果我们遇到了win7系统ODBC无法连接ORACLE的问题&#xff0c;要怎么处理win7系统ODBC无法连接ORACLE呢&#xff1f;我们只用1)操作系统是Win7 x64&#xff0c;客户端是Or…

spring-mvc教程_使用MVC模式制作游戏-教程和简介

spring-mvc教程游戏开发中一种有用的体系结构模式是MVC&#xff08;模型视图控制器&#xff09;模式。 它有助于分离输入逻辑&#xff0c;游戏逻辑和UI&#xff08;渲染&#xff09;。 在任何游戏开发项目的早期阶段&#xff0c;它的用途很快就会被注意到&#xff0c;因为它可以…

web前端开发需要学什么(包含前端学习路线)

前端开发&#xff0c;做到后面&#xff0c;是可以走很多方向的&#xff1b;但是要保证后期的平滑过度&#xff0c;前期还是要把一些必须的知识搞扎实的&#xff1b;web前端开发需要学什么环境搭建前端环境很好搭建&#xff0c;编辑器浏览器即可。浏览器推荐使用 Chrome行业内主…

2015年必火的五个Html5移动开发工具推荐

NO.1 DCloudHBuilder:基于HTML5开发工具 中文官网&#xff1a;http://www.dcloud.io/ DCloudHBuilder:基于HTML5开发工具是当前最快的HTML开发工具&#xff0c;强大的代码助手帮你快速完成开发&#xff0c;最全的语法库和浏览器兼容 性数据让浏览器碎片化不再头痛&#xff0c…

oracle 库存管理系统,库存管理系统

内容介绍原文档由会员 刘阳 发布库存管理系统页数 14 字数 9186[摘要]库存管理系统是生产、计划和控制的基础。本系统通过对仓库、货位等帐务管理及入&#xff0f;出库类型、入&#xff0f;出库单据的管理&#xff0c;及时反映各种物资的仓储、流向情况&#xff0c;为生产管理和…