Java性能权威指南-总结28

news2024/9/22 19:32:12

Java性能权威指南-总结28

  • 数据库性能的最佳实践
    • Lambda表达式和匿名类
    • Lambda表达式与匿名类加载

数据库性能的最佳实践

Lambda表达式和匿名类

对很多开发者而言,Java 8最激动人心的特性就是加入了Lambda表达式。不可否认,LambdaJava开发者的开发效率有着非常积极的影响,尽管收益难以量化,但是可以使用Lambda表达式来考查代码的性能。

关于Lambda表达式的性能,一个最基本的问题是,它们与其所对应的替代物匿名类相比如何。其实几乎没什么差别。关于如何使用Lambda表达式,常见的例子一般是从创建匿名内部类的代码入手(不过这类例子往往使用Stream ,而不是像下面这样使用迭代器:

	private volatile int sum;
	
	public interface IntegerInterface {
		int getInt();
	}
	public void calc() {
		IntegerInterface al = new IntegerInterface() {
			public int getInt() {
			return 1;
		}
	};
		IntegerInterface a2 = new IntegerInterface() {
			public int getInt(){
			return 2;
		}
	};
		IntegerInterface a3 = new IntegerInterface() {
			public int getInt(){
			return 3;
		}
	};
		sum = a1.get() + a2.get() + a3.get();
}

可以将其与下面使用了Lambda表达式的代码对比一下:

	public void calc() {
		IntegerInterface a3 ->{ return 3 };
		IntegerInterface a2 ->{ return 2 };
		IntegerInterface a1 ->{ return 1 };
		sum = a3.get() + a2.get() + a1.get();
	}

这里Lambda表达式或匿名类的代码体至关重要:如果其中执行了任何较为重型的操作,那花在这一操作上的时间会把Lambda表达式或匿名类实现上的细微差距掩盖掉。然而,即便在这种最简单的情况下,执行该操作的时间也基本一样,如下表所示:

使用Lambda表达式和匿名类执行calc()方法的时间
在这里插入图片描述

数字看上去比较正式,让人印象深刻,但除了说这两种实现性能基本相同,也得不出其他结论。确实如此,因为测试中存在随机波动,再加上这些调用都是用System.nanoTime()测量的。在这个层次上,这样计时还没有准确到足以让人信服;总而言之,可以知道的就是它们的性能相同。

在这个例子中的典型用法中,有一点比较有趣,每当方法被调用时,使用匿名类的代码都会创建一个新对象。如果这个方法调用次数非常多(当然必须在某个基准测试中测量其性能),会有很多这个匿名类的对象被快速创建并丢弃。这种用法对性能几乎没有什么影响。分配对象(以及更重要的初始化操作)的成本非常低,而且因为它们很快就会被丢弃,实际上不会拖慢垃圾收集器。

尽管如此,总是可以构造一些用例,来说明分配对性能影响很大,以及最好重用对象:

	private IntegerInterface a1 = new IntegerInterface() {
		public int getInt(){
		return 1;
		}
	};
	
	……其他接口类似……
		public void calc() {
			return a1.get() + a2.get() + a3.get();
		}
	}

Lambda表达式的这种典型用法,通常不会在每次循环迭代时创建一个新对象,所以在个别案例下,使用Lambda表达式的性能会好一些。尽管如此,即便要构造性能差异有影响的微基准测试,都是非常困难的。

Lambda表达式与匿名类加载

有种极端情况,即在启动和类加载时,两种实现的性能差别很明显。人们很容易查看Lambda表达式的代码,并断定它不过是语法糖,底层还是创建匿名类(特别是从长远来看,两者的性能一样)。但现在的工作方式并不是这样的。JDK 8中,Lambda表达式的代码会创建一个静态方法,这个方法通过一个特殊的辅助类来调用。而匿名类是一个真正的Java类,有单独的class文件,并通过类加载器加载。

如前面所介绍的,类加载的性能可能很重要,特别是在classpath很长的情况下。如果这个例子就是在这样的情况下运行——calc()方法每次都在一个新的类加载器中执行,那匿名类实现就处于劣势了。下表列出了这种情况下的差别。

在一个新的类加载器中执行calc()方法的时间
在这里插入图片描述

关于这些数字,有一点要提一下:它们都是在经过一段适当的热身周期(以开启编译)之后再测量的。但是在热身阶段会发生另一件事:class文件第一次被从磁盘读取出来。操作系统会把这些文件保存在内存(操作系统的文件缓冲区)中。所以代码第一次执行需要的时间比较长,因为要通过读文件的系统调用把文件从磁盘中真正地加载进来。随后的调用会快很多:尽管仍然需要通过系统调用读文件,但因为这些文件已经在操作系统的内存中,所以数据可以快速返回。因此,匿名类实现的性能可能要比想象中好,因为它并没有真正地从磁盘读取class文件。

快速小结

  1. 如果要在Lambda表达式和匿名类之间做出选择,则应该从方便编程的角度出发,因为性能上没什么差别。
  2. Lambda表达式并没有实现为类,所以有个例外情况,即当类加载行为对性能影响很大时,Lambda表达式略胜一筹。

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

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

相关文章

mac电脑 flv转mp4怎么转

mac电脑 flv转mp4怎么转?相信大家平时在电脑上下载视频的时候遇到过这样一个尴尬的事情,下载下来的视频不能被直接打开播放,而是需要使用专门的播放器才能打开查看,例如flv就是这样一种视频格式。大家都知道视频文件的格式种类非常…

CoT及ReAct解密与实战(三)

第8章 CoT及ReAct解密与实战 8.5 ReAct及计划和执行案例实战 我们来看一下LangChain的官方文档,首先它很简单的说了一下,计划和执行代理(Plan and execute agents)首先计划要做什么,然后执行子任务来实现目标,言外之意ReAct不是这样的,我们在ReAct中看见的内容是,有一步…

Debian使用Tomcat实现国密访问

环境准备: Debian 10 java version "1.8.0_131 Apache Tomcat/9.0.76 360国密浏览器 一.下载并安装jdk8 1.访问网站下载jdk8 https://www.oracle.com/java/technologies/downloads/#java8 2.解压到相应目录 3.配置环境变量 vim ~/.bashrc# java export JAV…

云端地球在建筑设计行业的应用

背景概述 建筑设计行业一直处于技术革新的前沿。随着数字化、信息化、智能化等技术的不断发展,建筑设计也将呈现出新的发展趋势。比如,计算机辅助设计、虚拟现实技术等将成为建筑设计的重要工具。此外,人工智能、大数据、物联网等新技术的应…

leetcode刷题——复制带随机指针的链表

思维导图: 题目描述: 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点…

WPS Office AI实战:AI带来的文档智能化体验

前面我们已经了解过 AI 在PPT制作、Word写作方面带来的革命性效率提供,今天一起来聊聊在线文档的AI应用。如果你习惯用在线文档的话,一样也可以享受到AI的强大优势。金山在线智能云文档已经接入WPS Office AI套件大家庭,用AI来改造写作的新时…

QT day3作业

有点不对,不能运行了,怪事 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//字体 void Widget::on…

认识MQTT(C语言)

MQTT基础概念 MQTT 入门介绍 | 菜鸟教程 MQTT使用 在linux下搭建MQTT服务器(Broker) 在linux下执行下面命令安装MQTT服务器 📎mosquitto-1.6.3.tar.gzhttps://www.yuque.com/attachments/yuque/0/2023/gz/35243076/1687955850547-b594126…

003-Dubbo服务的发布和引用

目录 Dubbo3.0发布注册应用级注册-配置应用级注册-端口应用级注册-消费者-确定服务信息应用级注册-消费者-元数据中心 Dubbo3.0 发布注册 应用级注册-配置 因为接口级注册随着服务增多,注册中压力会越来越大 所以在3.0版本提供了应用级注册 #默认是all 接口和应…

两两交换链表中的节点——力扣24

题目描述 方法一:递归 class Solution{ public:ListNode* swapPairs(ListNode* head){if(!head || !head->next){return head;} ListNode* newHead head->next;head->next swapPairs(newHead->next);newHead->next head;return newHead;} }; 方法…

python以固定时间间隔取行

目录 1. 间隔取行2. 时间戳间隔取行:下采样参考链接 1. 间隔取行 dataframe 实现每隔 n 行取 1 行 近期在做数据分析的时候,用到了对csv文件每隔n行取1行的操作,正常情况下会立马想到for循环,可能大家还会有其他方法&#xff0c…

第八章——函数探幽

C内联函数 内联函数是为了提高程序运行速度所做的一项改进。常规函数与内联函数的主要区别不在于编写方式,而在于C编译器如何将它们组合到程序中。 对于 C内联函数,编译器将使用相应的函数代码替换函数调用,程序无需跳到另一个位置处执行代…

LEADTOOLS V22 支持.NET 5-7.0 Crack

使用 LEADTOOLS 构建更好的应用程序 LEADTOOLS 由专利人工智能和机器学习算法提供支持,是一系列综合工具包,可将识别、文档、医疗、成像和多媒体技术集成到桌面、服务器、平板电脑、网络和移动解决方案中。 光学字符识别/ICR 以无与伦比的速度和准确性提…

Django系列所有漏洞复现vulhubCVE-2018-14574,CVE-2022-34265,CVE-2021-35042

文章目录 Django < 2.0.8 任意URL跳转漏洞&#xff08;CVE-2018-14574&#xff09;漏洞详情&#xff1a;复现&#xff1a; Django Trunc(kind) and Extract(lookup_name) SQL注入漏洞&#xff08;CVE-2022-34265&#xff09;漏洞详情&#xff1a;复现&#xff1a; Django Qu…

十五分钟逐步掌握关键路径问题(时间余量、关键活动以及关键路径的求解)

关键路径问题 名人说&#xff1a;莫听穿林打叶声&#xff0c;何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 本篇笔记整理&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 关键路径问题〇、概念说明1、AOE网2、关键路…

微服务系列文章之 nginx负载均衡

nginx负载均衡 负载均衡建立在现有网络结构之上&#xff0c;提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽&#xff0c;增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。 随着网站的发展&#xff0c;服务器压力越来越大&#xff0c;我们可能首先会将数…

虚拟IP绑定公网IP访问

绑定公网 IP 我们目前的虚拟 IP&#xff0c;还不能通过公网的形式进行访问&#xff0c;我们首先&#xff0c;来使用内部的 IP 进行访问看看效果如下&#xff1a; curl 虚拟IP 如上图我访问了两次&#xff0c;第一次访问返回的是 2222 的 nginx&#xff0c;第二次访问是 1111 的…

【SpringCloud-9】JWT

这一篇主要介绍一下&#xff0c;微服务之间的用户权限问题。 通常呢&#xff0c;对于用户的登录鉴权&#xff0c;有两种方式&#xff1a; 1、基于session的方式&#xff1a; session是要存到服务端的&#xff0c;但是分布式服务太多&#xff0c;不可能每个服务端都存。 那就…

Python:文件选择界面 and 文件夹选择界面

文章目录 &#xff08;1&#xff09;文件选择界面&#xff08;2&#xff09;文件夹选择界面 Python本身没有内置的文件夹选择界面。然而&#xff0c;可以使用第三方库来实现在代码中选择文件或文件夹的功能。一个常用的库是tkinter&#xff0c;它是Python的标准GUI库之一&#…

IDEA中侧边栏没有git commit模块,如何恢复?

一、修改之前 侧边栏没有git commit模块 二、修改之后 侧边栏恢复了git commit模块 三、下面是恢复教程 1.中文版 打开 文件 -> 设置 -> 版本控制 -> 提交 -> 勾选 【使用非模式提交界面】 -> 点击【确定】 2.英文版 打开 file -> Settings -> Version Co…