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

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

  1. 字符串压缩 java_如何在Java中压缩字符串?

    如何在Java中压缩字符串? 我使用GZIPOutputStream或ZIPOutputStream压缩字符串(我的2222235278130938882小于20),但压缩结果比原始字符串长. 在某个 ...

  2. 多线程线程池的实现java_如何在Java中实现线程池

    多线程线程池的实现java 线程是独立程序的执行路径. 在java中,每个线程都扩展java.lang.Thread类或实现java.lang.Runnable. 多线程是指在一个任务中同时执行两个或 ...

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

    总览 Java有许多可能很慢的领域. 但是,对于每个问题都有解决方案. 许多解决方案/黑客都需要解决Java的保护问题,但是如果您需要低水平的性能,还是可以的. Java使高级编程变得更简单容易,但代 ...

  4. setyear java_如何在Java中创建不可变类

    如果对象在构造后无法更改,则该对象是不可变的.不可变对象不会以任何方式暴露其他对象来修改其状态; 对象的字段仅在构造函数内初始化一次,并且永远不会再次更改. 在本文中,我们将定义在Java中创建不可变 ...

  5. 怎么比较字符串java_如何在Java中比较字符串?

    在本文中,优锐课将带你学习如何比较字符串以及使用等于(=)运算符比较字符串时发生的问题. 介绍 字符串是Java中的特殊类.我们在Java程序中定期使用String,因此比较两个字符串是Java中的一 ...

  6. jpeg java_如何在java中使jpeg无损?

    JAI包提供了保存"无损JPEG"格式的能力.根据您想要的变体将压缩类型设置为 JPEG-LS or JPEG-LOSSLESS. 我不确定你真的想要无损JPEG.这是一种单独的格 ...

  7. keypair java_如何在Java中序列化和反序列化RSA KeyPair

    我想在我的Java应用程序中实现一些非常基本的安全性,但是一开始我就陷入了困境. 我想做的是这样的: 1-生成RSA密钥对 2将这些密钥以序列化形式存储在数据库中,以便在下次运行该应用程序时重新创建它 ...

  8. list 索引 java_如何在Java中保持List索引的固定

    您可能希望将 java.util.SortedMap与int键一起使用: import java.util.*; public class Test { public static void main ...

  9. sqlite java_如何在Java中使用Sqlite

    展开全部 javasqlite如何实现数62616964757a686964616fe4b893e5b19e31333337373661据库的操作: Javasqlite公开了几个类,包括:Autho ...

最新文章

  1. 不错的东西: AutoMapper
  2. Eclipse和MyEclipse自动提示设置
  3. js 为什么0.1+0.2不等于0.3
  4. 原理+实战掌握SQL注入方法
  5. /home/appleyuchi主目录迁移到新磁盘中
  6. js动态创建对象_JS深浅拷贝的深入浅出
  7. VS Code 中有哪些好用的 Azure 插件?
  8. C 迭代器iterator的实现原理
  9. 均分纸牌(洛谷-P1031)
  10. OpenCV3学习(12.5) opencv实现粒子滤波目标跟踪
  11. java 中 class 对象_java中Class对象详解
  12. 简单hbase java,Hbase 简单java API 操作
  13. ASPNetCore MVC ModelValidation-ajax
  14. netdraw绘制网络结构图
  15. 苹果电脑安装windows系统 失败后 磁盘空间丢失
  16. Collecting package metadata (current_repodata.json): fail亲测成功
  17. 去掉WPS智能生成目录中的空白行
  18. 计算机中加密文件找不见,打开或解密闪电加密文件夹找不到加密数据怎么办
  19. 字节面试官推荐的一份 Java 基础面试题!太顶了
  20. UI基础一:简单的BOL查询

热门文章

  1. Linux清理磁盘挂载点方法(亲测有效)
  2. MySQL笔记汇总---狂神说
  3. php 去掉url中的index.php,php 去掉url中的index.php
  4. 纹理和基元_Java的精妙之处,包括基元和变量参数数组
  5. java args_Java命令行界面(第2部分):args4j
  6. web.xml.jsf_JSF 2.2在30秒内创建一个自定义Hello World组件
  7. 抽象工厂模式设计模式_21世纪的设计模式:抽象工厂模式
  8. 序列化加密字段_自动加密可序列化的类
  9. c++返回指针时候注意提防_Java 8陷阱–提防Files.lines()
  10. AWS Loft的数据库周