c#枚举类似于java_如何在Java中获得类似于C的性能

c#枚举类似于java

总览

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

c#枚举类似于java

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

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

相关文章

c支限界算法语言n皇后问题分,n皇后问题(分析)

这道题需要用到回溯算法,现在在这里先简单的介绍一下这个算法:回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路…

oracle instr查询字符串

INSTR (源字符串, 目标字符串, 起始位置, 匹配序号) 在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的位置。只检索一次,就是说从字符的开始 到字符的结尾就结束。 语法如下: instr( string1, string2 [, start_position [, nth_…

android系统相机自动录像,android 调用系统相机录像并保存

1、在AndroidManifest.xml中添加如下代码tools:ignore"ProtectedPermissions" />android:authorities"${applicationId}.provider"android:name"android.support.v4.content.FileProvider"android:exported"false"android:grantUri…

【原创】jpgraph中文乱码问题的解决

php jpgraph库非常强大,可以在后台生成图片 后台生成在需要导出图表型报告的时候非常有用,当然,前端的可视化还是要用highcharts/echarts/anycharts等类库 比较麻烦的是中文乱码问题,有3个地方乱码: legendsetStickLab…

getstring方法android,JSON中optString和getString方法的区别

JSON中optString和getString方法的区别更新时间:2017年07月07日 15:18:24 投稿:mrroptString方法会在对应的key中的值不存在的时候返回一个空字符串,但是getString会抛一个JSONException 。下面通过一段代码给大家介绍JSON中optString和get…

QT+vs2010下改变可执行程序的图标

原地址:http://blog.163.com/tijijun126/blog/static/6820974520134209457308/ 在解决方案下面的工程里,点击右键-》选择【添加(D)】-》选择【资源(R)】-》选择【Icon】-》新建/导入就可以了。转载于:https…

jpanel把原本内容覆盖掉_A5:APP关键词覆盖你该了解哪些

A5:APP关键词覆盖你该了解哪些点击上方蓝字关注我们苹果ios/安卓-各大应用商店ASO优化大全IOS关键词覆盖1、苹果AppStore关键词搜索的权重排序为app标题、副标题>app关键词>app描述>宣传文本及评论(App关键词100字符)。2、如何优化100字符关键词①、根据产品用户画像分…

android音乐播放器音乐加载,Android开源音乐播放器之在线音乐列表自动加载更多...

系列文章前言当咱们的ListView数据比较多时,咱们通常都会选择分页显示,而分页显示就须要一个动做触发加载更多操做,一般咱们会使用上拉加载更多,但我以为不够人性化,由于用户须要手动上拉,因此更加人性化的…

最短路径--Floyd算法

Floyd算法 1.定义概览 Floyd-Warshall算法(Floyd-Warshall algorithm)是解决任意两点间的最短路径的一种算法,可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。Floyd-Warshall算法的时间复杂度为O(N3)…

vue 打开一个iframe_Vue 之五 —— 单元测试

单元测试(unit testing):是指对软件中的最小可测试单元进行检查和验证。代码的终极目标有两个,第一个是实现需求,第二个是提高代码质量和可维护性。单元测试是为了提高代码质量和可维护性,是实现代码的第二…

Hibernate如何存储二级缓存条目

介绍 使用数据库访问抽象层的好处是可以透明地实现缓存,而不会泄漏到业务逻辑代码中 。 Hibernate Persistence Context充当事务后写式高速缓存 ,将实体状态转换转换为DML语句。 持久性上下文充当逻辑事务存储,并且每个Entity实例最多可以具…

file协议访问linux,Mozilla Firefox for Android 'file'协议未授权访问漏洞(CVE-2014-1501)

发布日期&#xff1a;2014-03-18更新日期&#xff1a;2014-04-02受影响系统&#xff1a;Mozilla Firefox < 28.0描述&#xff1a;--------------------------------------------------------------------------------BUGTRAQ ID: 66424CVE(CAN) ID: CVE-2014-1501Firefox是…

DrJava试用笔记

安装方便&#xff1a;只要配好JAVA_HOME&#xff0c;用java -jar drjava-stable-20120818-r5686.jar即可启动&#xff0c;算是绿色软件&#xff1b; 特色功能&#xff1a;交互式命令行&#xff0c;可以在调试程序时改变变量值&#xff0c;很方便&#xff1b; 编辑功能比较弱&…

dcdc芯片效率不高的原因_半导体厂商如何做芯片的出厂测试?

本文来源于知乎&#xff0c;已获作者授权&#xff0c;谢谢。作者&#xff1a;温戈链接&#xff1a;https://www.zhihu.com/question/20584576/answer/1538640891知乎网友提问&#xff1a;半导体厂商如何做芯片的出厂测试&#xff1f;例如 Intel 的 CPU、手机处理器&#xff0c;…

在运行时更新代码(已Spring解密)

当从编译到部署再到测试的开发周期花费太长时间时&#xff0c;人们希望能够及时替换正在运行的代码&#xff0c;而无需重新启动应用程序服务器并等待部署完成。 在这种情况下&#xff0c;像JRebel这样的商业解决方案或像Grails这样的开源框架就可以提供帮助。 JVM不支持在运行…

魅族android n内测报名,不再万年Android 5.0! Flyme安卓N内测招募开启

科客点评&#xff1a;恰逢Flyme五周年庆&#xff0c;这算的是给煤油们最大的礼物。近日&#xff0c;魅族Flyme系统非常活跃&#xff0c;为国内友商操碎了心&#xff0c;为此适配了一众友商热门机型&#xff0c;刷了不少存在感&#xff0c;但这显然不是魅族要搞的“大事情”。6月…

Android AudioTrack/AudioRecord -wav文件读取3

下面是一个网上一个大神写的,在公司测过了,还不错. 还可以写一个构造函数: initReader(InputStream is){ fis new FileInputStream(is); bis new BufferedInputStream(fis); }eg:call it as following : InputStream isActivity.getResource().openRawResource(); InitRe…

db2数据库连接数 linux_介绍一款数据库管理工具DBeaver

之前连接MySQL一直使用的是navicate&#xff0c;挺好用的&#xff0c;不过是个付费软件&#xff0c;一直想找一款免费开源的软件来替代。今天偶然间发现DBeaver&#xff0c;这是一款基于java开发的数据库工具&#xff0c;而且可以支持Windows、Linux、MacOS多个平台&#xff0c…

jqgrid mvc_jqGrid,REST,AJAX和Spring MVC集成

jqgrid mvc两年多以前&#xff0c;我写了一篇关于如何在Struts2中实现优雅的CRUD的文章。 实际上&#xff0c;我必须就该主题写两篇文章&#xff0c;因为该主题如此广泛。 今天&#xff0c;我采用了一套更为流行的&#xff0c;完善的框架和库&#xff0c;采用了更为轻量级的现代…

android view getwidth 0,Android中View.getWidth()和View.getMeasuredWidth()的区别

一。也許很多童鞋對getWidth()和getMeasuredWidth()的用法有很多的不解&#xff0c;這兩者之間有什麼樣的不同呢&#xff0c;網上也有各種不同的版本&#xff0c;但大多數都大同小異&#xff0c;從這個地方CtrlC,到另一個地方CtrlV,沒有把問題說透&#xff0c;也有一部分文章誤…