如何在Java中获得类似于C的性能

总览

Java有许多可能很慢的领域。 但是,对于每个问题都有解决方案。 许多解决方案/黑客都需要解决Java的保护问题,但是如果您需要低水平的性能,还是可以的。

Java使高级编程变得更简单容易,但代价是使低级编程变得更加困难。 幸运的是,大多数应用程序都遵循经验法则,即您将90%的时间花费在10%的代码中。 这意味着您有90%的时间状况良好,而有10%的时间状况较差。 ;)

这让我想知道为什么对于大多数项目,您会用C / C ++编写超过10%的代码。 在某些项目中,C / C ++是唯一明智的解决方案,但是我怀疑大多数C / C ++项目都可以通过使用Java之类的高级语言来提高生产力。

获得类似C的性能的一种方法是通过JNI将C用于代码的关键部分。 如果要避免使用C或JNI,仍然可以通过多种方法获得所需的性能。

注意:这些建议大多数仅适用于独立应用程序,而不适用于applet。

注意2:使用风险自负。 您可能需要测试使用低级Java时通常不需要担心的极端情况。

快速阵列访问

Java可能较慢的一个方面是数组访问。 这是因为它隐式地进行边界检查。 JVM足够聪明,可以通过检查第一个和最后一个元素来优化循环检查,但这并不总是适用。

一种解决方法是使用Unsafe类(该类仅在某些JVM上可用,而OpenJDK JVM才可用)。该类为每种基本类型都具有getXxxx()和setXxxx(),并允许您直接访问对象,数组或直接内存,其中您必须进行边界检查。 在本机代码中,这些被编译为单个机器代码指令。 还有一个getObject(),setObject()方法,但是我怀疑它们不能提供很多性能改进(在您访问对象时也是如此)

您可以通过下载OpenJDK的调试版本并获取其打印已编译的本机代码来检查为方法生成的本机代码。

任意内存访问

您可以再次使用Unsafe类进行任意访问,但是“更友好”的方法是使用DirectByteBuffer并根据需要更改其地址和限制(通过反射或通过JNI)。这将为您提供一个Buffer,它指向一个随机区域。内存,例如设备缓冲区。

使用更少的内存

这已不再是一个问题。 一台16 GB的服务器售价为1000美元,一台1 TB的服务器售价约为7万美元。

但是,缓存仍然是一种溢价,对于某些应用程序而言,它值得减少内存消耗。 一个简单的事情是使用Trove ,它可以有效地支持集合中的原语。 如果数据表很大,则可以按列而不是按行存储数据(如果有很多行数据和几列数据)。 如果您要按字段扫描数据但不需要所有字段,则可以改善缓存行为。

您还可以使用直接存储器按需要存储数据。 这就是BigMemory库所使用的。

基于流的IO速度很慢,NIO很难使用

如何利用您的两全其美? 在NIO中使用阻塞IO(这是通道的默认设置)除非需要选择器,否则不要使用选择器。 在许多情况下,它们只会增加复杂性。 大多数系统可以有效处理1K-10K线程。 如果您需要更多的连接,请购买另一台服务器,一台便宜的服务器大约需要500美元。

快速高效的字符串

Java 6 update 21具有选项-XX:+ UseCompressedStrings,对于不需要16位字符的字符串,可以使用byte []代替char []。 对于许多应用程序,这可以节省内存,但速度较慢。 (5%-10%)

相反,您可以使用自己的Text类型来包装byte [],或者从ByteBuffer,CharBuffer中获取文本数据或使用Unsafe。

更快的启动时间

当您加载许多肿的库时,Java的启动时间往往很慢。 如果这确实是一个问题,那么您加载较少的库。 无论如何,将它们保持在最低水平是一个好习惯。 这样做,您的启动时间将为几秒钟(不及C快,但可能足够快)

更少的GC暂停

大多数Java库都是自由创建对象的,通常这不是问题。

但是,这并不意味着您不能预先分配对象,不能使用直接字节缓冲区和对象回收技术来最大程度地减少对象的创建。 通过增加Eden大小,您可以拥有很少使用GC的应用程序。 您甚至可以将其每天减少到一个GC(例如按计划的通宵工作)

参考: 如何从Vanilla Java的 JCG合作伙伴 Peter Lawrey 获得Java的C类性能 。

相关文章:
  • Java中的低GC:使用原语而不是包装器
  • 每个程序员都应该知道的事情
  • 正确记录应用程序的10个技巧
  • 软件设计法则
  • Java最佳实践系列
  • 生存在狂野西部开发过程中的9条提示

翻译自: https://www.javacodegeeks.com/2011/07/how-to-get-c-like-performance-in-java.html

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

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

相关文章

STARTUPINFO结构

1.结构原型 typedef struct _STARTUPINFO { DWORD cb; LPTSTR lpReserved; LPTSTR lpDesktop; LPTSTR lpTitle; DWORD dwX; DWORD dwY; DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD w…

Spring声明式事务示例

事务是具有ACID (原子的,一致的,隔离的和持久的)属性的工作单元。 原子意味着所有更改都发生或什么都没有发生。 如果从一个帐户借钱并贷记到另一个帐户,则交易将确保借记和贷项均已完成或均未完成。 一致表示更改使数…

路径 (Path)–nodejs

本模块包含一套用于处理和转换文件路径的工具集。几乎所有的方法只做字符串变换, 不会调用文件系统检查路径是否有效。 通过 require(path) 来加载此模块。以下是本模块所提供的方法: path.normalize(p) 规范化字符串路径,注意 .. 和 . 部分 …

OllyDBG反汇编快速找到程序入口一点分析

出处:http://hi.baidu.com/0soul/blog/item/b62f8f08c2c3c42c6b60fbbe.html 先声明下:这个和脱壳没关系,不是找壳里面的程序入口哦,只是程序本身的入口,个别朋友不要误会哈。其实这个应该是基础,但我经常找…

简单的Twitter:Heroku上的Play框架,AJAX,CRUD

因此,重大的公告发布了– Heroku开始为Play Framework应用程序提供本机支持! 如果您还没有听说过,请在Heroku的博客上查看Jesper Joergensen的帖子 。 因此,对于演示,我将建立一个非常基本的Twitter副本; 它…

Cron表达式

CronTrigger CronTriggers往往比SimpleTrigger更有用,如果您需要基于日历的概念,而非SimpleTrigger完全指定的时间间隔,复发的发射工作的时间表。CronTrigger,你可以指定触发的时间表如“每星期五中午”,或“每个工作日…

深入理解JavaScript学习笔记(3)_全面解析Module模式

简介 Module模式是JavaScript编程中一个非常通用的模式,一般情况下,大家都知道基本用法,本文尝试着给大家更多该模式的高级使用方式。 首先我们来看看Module模式的基本特征: 模块化,可重用封装了变量和function&#x…

汇编----乘指令: MUL、IMUL

MUL: 无符号乘 ;影响 OF、CF 标志位;指令格式:;MUL r/m ;参数是乘数;如果参数是 r8/m8, 将把 AL 做乘数, 结果放在 AX;如果参数是 r16/m16, 将把 AX 做乘数, 结果放在 EAX;如果参数是 r32/m32, 将把 EAX 做乘数, 结果放在 EDX:EAX IMUL: 有符号乘 ;影响 OF、CF 标志位;…

Google App Engine Java功能和命名空间API

功能API 使用Capabilities API,您的应用程序可以检测特定API功能的停机和计划停机时间。 您可以使用此API来检测应用程序何时不可用,然后绕过它来减少应用程序的停机时间。 我们该如何处理,这是个折衷方案? 1.优雅:创…

破解key file时经常用到的几个API函数及其用法

CreateFile函数 ================================================================================== CreateFile: Creates or opens a file or I/O device. The most commonly used I/O devices are as follows: file, file stream, directory, physical disk, volume, …

PHP计划任务之关闭浏览器后仍然继续执行的函数

函数名称:ignore_user_abort 本函数配置或取得使用端连接中断后,PHP 程序是否仍继续执行。默认值为中断连接后就停止执行。在 PHP 配置文件中 (php3.ini/php.ini) 的 ignore_user_abort 选项就是配置处。本功能在 PHP 3.0.7 版之后才开始提供。 官方说明…

node--更新数据库问题

昨天测试blog的comment功能,在新增comment相关的代码之后,重启应用,出现Cannot call method forEach of undefined 。反复核对代码,都没发现异常,最后将数据库文件删除之后,再重启数据库,一切正…

U盘做完启动盘,如何恢复原始容量

(1)右击“我的电脑”,选择“管理”选项,之后选择“磁盘管理”,查看自己U盘的索引,如:Disk 1(2)在运行窗口,输入cmd,回车,出现Dos运行环…

GWT Spring和Hibernate进入数据网格世界

利用Infinispan数据网格的功能最大化Hibernate性能。 一个GWT , Spring , JPA , Hibernate , Infinispan集成教程。 在本教程中,我们将讨论如何将Infinispan用作Hibernate二级缓存提供程序。 Infinispan是JBoss缓存的…

记对一个key file crackme的破解

crackme下载地址: http://kssd.pediy.com/tutorial/exercise/section04/chap6-1-4-03.zip ------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------…

第八章 CTE 递归 及 分组汇总 高级部分(多维数据集)

UNION 等集合操作符:UNION 等以第一个 SELECT 的 列明 作为 整个结果集的列明,整个结果集 唯一认可的 唯一逻辑处理阶段 是 ORDER BY 这个意思是说 只有 ORDER BY 是对整个结果集作用的,其它都操作都作用在 UINON 两侧的 子集合中。EXCEPT 操…

Java Code Geeks Andygene Web原型

大家好, 我们很高兴地宣布,一组Maven原型的第一个版本已经发布!!! 该集合的目的是提供可以满足各种开发需求的项目模板。 您可以在本文末尾找到JCG路线图。 该第一个发行版旨在提供项目模板-Web应用程序的体系结构。 …

关于如何用od反汇编win32 控制台程序

*********************************************************** 如何用od反汇编win32 控制台程序(类似dos程序)呢?*********************************************************** 注:od是用来调试win32程序的 1.反编译win32 控制台程序&…

Chrome/Chromium HTML5 video 视频播放硬件加速

Chromium站点上有个大致的框图。描写叙述了Chromium的video在各个平台 - 包含Android - 上是怎样使用硬件资源来做视频编解码加速的: 而依据Android Kitkat上的Chromium代码分析,HTML5 video播放硬件加速,终于是使用MediaCodec.java来利用本地…