如何编写以最快速度执行的代码,同时仍将编码保持在最低限度?

最短代码和最低延迟

谁能编写具有最低延迟的最短Java代码,以及使用了哪些工具?

更具体地说,目标是开发一个Java应用程序,使用通用解决方案计算现有1,000部电影中五部电影的总和,最小,最大和平均租赁时间。五个胶片应该是围绕中间胶片长度的胶片,从498开始,到第502胶片(包括)以胶片上升长度结束。

基于SQL / JDBC的解决方案

解决问题的一种方法是直接使用SQL / JDBC,如下所示。下面是一个SQL代码示例,它解决了问题的计算部分:

如果我在笔记本电脑上运行它,我会在服务器端获得大约790微秒的延迟(标准MySQL 5.7.16)。要使用此解决方案,我们还需要添加Java代码以发出SQL语句并将值从JDBC读回到Java变量中。这意味着代码将更大,执行时间更长,如下所示:

为了给这个替代方案提供一个公平的机会,我重新使用了基准测试中的调用之间的连接,而不是每次都重新创建它

结果:~1,000 us和~25代码行

使用了Speedment in-JVM内存加速:

这比SQL / JDBC快得多,并且只需6微秒即可完成。

优化的速度解决方案

事实上,有一种方法可以比获胜贡献更多地改善延迟。通过应用IntFunction能够int直接从RAM 进行值的原位反序列化(原位),它可以进一步提高性能。就地反序列化意味着我们不必反序列化整个实体,只需提取所需的部分即可。这节省了时间,特别是对于具有许多列的实体。以下是优化解决方案的外观:

这甚至更快,并在3微秒内完成。

只要5行代码的解决方案

GraalVM和优化的速度解决方案

GraalVM包含一个改进的C2编译器,已知可以改善许多工作负载的流性能。特别是,在Graal下,内联和逃逸分析的好处似乎要比普通的OpenJDK好得多。

我很想知道上面的优化解决方案如何从GraalVM中受益。没有代码更改,我在GraalVM(1.0.0-rc9)下运行它,现在,延迟降低到1微秒!这意味着我们可以在笔记本电脑上每个线程每秒执行1,000,000个此类查询,并且可能在服务器级计算机上执行更多。

概观

当我们将SQL / JDBC延迟与最佳Speedment解决方案进行比较时,Speedment的加速因子大约为1,000倍。。如果您想简化代码,这是一个巨大的进步。

为了能够在图表中绘制解决方案,我删除了相对较慢的SQL / JDBC解决方案,并仅显示了不同的Speedment解决方案和运行时如何:

基准笔记

上面提到的基准测试结果是在我的MacBook Pro Mid 2015,2.2 GHz Intel Core i7,16 GB 1600 MHz DDR3,Java 8,JMH(1.21)和Speedment(3.1.8)上运行时获得的

结论

使用in-JVM内存技术和Java流可以同时减少数量级的延迟并减少代码大小。此外,GraalVM可以在许多条件下显着提高您的流性能。

java短_Java中的最短代码和最低延迟相关推荐

  1. lombok 生成代码_使用Project Lombok减少Java应用程序中的样板代码

    lombok 生成代码 对Java编程语言最常提出的批评之一是它需要大量的样板代码 . 对于简单的类尤其如此,该类只需要存储一些值就可以. 您需要这些值的getter和setter方法,也许您还需要一 ...

  2. 使用Project Lombok减少Java应用程序中的样板代码

    对Java编程语言最常提出的批评之一是它需要大量的样板代码 . 对于简单的类尤其如此,该类只需要存储一些值就可以. 您需要这些值的getter和setter,也许您还需要一个构造函数,覆盖equals ...

  3. java构造块_java中的静态代码块、构造代码块、构造方法详解

    运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System. ...

  4. java中switch用法举例范围_Java中Switch用法代码示例

    一.java当中的switch与C#相比有以下区别 注:在java中switch后的表达式的类型只能为以下几种:byte.short.char.int(在Java1.6中是这样), 在java1.7后 ...

  5. java继续_Java中消除实现继续和面向接口编程

    在匆忙之际理清消除实现继续和面向接口编程这样两个大题目可不是一件轻易的事情,尤其考虑到自身的熟悉水平.坦白的说,这又是一篇"炒冷饭"的文章,但这"冷饭"又确实不 ...

  6. java泛型编程_Java编程泛型限定代码分享

    泛型 一般 出现在集合中,迭代器中 也会出现! 泛型 是为了 提高代码的 安全性. 泛型 确保数据类型的唯一性. 在我们常用的容器中, 越是单一越好处理啊! 泛型的限定: ? 是通配符 指代 任意类型 ...

  7. java 难度_java中难度大一点的面试题

    1.请大概描述一下Vector和ArrayList的区别,Hashtable和HashMap的区别.(5) (1)Vector和ArrayList的异同 实现原理,功能相同,可以互用 主要区别: Ve ...

  8. 类与方法java讲解_Java中方法使用的深入讲解

    方法的使用 1.方法的基本用法 什么是方法,方法就是一个代码片段,类似于c/c++ 语言中的"函数". 1.1方法存在的意义: 是能够模块化的组织代码(当代码规模比较复杂的时候). ...

  9. java引_JAVA中的引用

    JDK1.2之后,Java扩充了引用的概念,将引用分为强引用.软引用.弱引用和虚引用四种. 强引用 类似于"Object a = new Object()"这类的引用,只要垃圾强引 ...

最新文章

  1. 在Leangoo里怎么修改昵称,简称,头像?
  2. 遍历二叉树的各种操作(非递归遍历)
  3. python递归查找值返回_python – 从树递归中返回值列表
  4. TabActivity,LocalActivityManager,TabHost,TabWidget深度分析(二)
  5. 网易云信浏览器WebRTC视频聊天集成
  6. 进销存系统测试实战-功能测试
  7. idea切换工作空间_IDEA在一个工作空间中管理多个项目的详细步骤
  8. STM32输出PWM波形以及实现LED呼吸灯
  9. 普通人现在入局做抖音短视频晚么 选择项目的标准是什么
  10. Http发送get、post、delete、put请求
  11. win2003 php asp.net,Win2003下配置iis+php+mysql+zend图文 使其支持asp,.net,cgi,perl和php
  12. system.in.read()用法
  13. 撸起袖子加油干努力实现中国梦想PPT模板
  14. 目标检测2022最新进展
  15. 解决listview 嵌套listview
  16. Android 实验二:Android MVC模式
  17. yii2 打开GII 的配置
  18. Unity3D 取消发布游戏启动时的设置窗口并窗口化运行
  19. php时间戳转时间 jq,jQuery时间戳和日期相互转换操作示例
  20. 《如何阅读一本书》这本书为什么值8.4分?

热门文章

  1. Redhat和ubuntu的区别
  2. 当选51CTO技术论坛2010年度十大杰出版主感言
  3. Topo系统的益处和帮助
  4. php 可以动态的new一个变量类名
  5. ExtJs异步ajax调用和同步ajax调用公用方法
  6. python算法与数据结构-希尔排序算法(35)
  7. django2.2连接mysql遇到的坑(亲测)
  8. 以太主义的创始人维塔利克·布特林(Vitalik嫩模 Butlin)被称为“V神”
  9. crontab 详细用法 定时任务
  10. Go的slice扩容机制