java调用怎么调用方法区_Java中的方法调用有多昂贵

java调用怎么调用方法区

我们都去过那儿。 在查看设计不良的代码的同时,听听作者对人们永远不应该牺牲性能而不是设计的解释。 而且,您不能说服作者摆脱其500行方法,因为链接方法调用会破坏性能。

好吧,这可能在1996年左右是正确的。 但是自那时以来, JVM已经发展成为一款了不起的软件。 找出它的一种方法是开始更深入地研究虚拟机执行的优化。 JVM应用的技术库非常广泛,但是让我们更详细地研究其中一种。 即方法内联 。 通过以下示例最容易解释:

int sum(int a, int b, int c, int d) {return sum(sum(a, b),sum(c, d));
}int sum(int a, int b) {return a + b;
}

当运行此代码时, JVM将弄清楚它可以用更有效的所谓“内联”代码代替:

int sum(int a, int b, int c, int d) {return a + b + c + d;
}

您必须注意,此优化是由虚拟机而不是由编译器完成的。 最初做出此决定的原因并不透明。 毕竟-如果您查看上面的示例代码-为什么在编译时可以推迟优化以产生更有效的字节码? 但是,考虑到其他不太明显的情况,JVM是执行优化的最佳位置: Java source code

  • JVM除了静态分析外还配备了运行时数据。 在运行时,JVM可以根据最常执行的方法,冗余的负载,何时安全使用副本传播等做出更好的决策。
  • JVM已获得有关基础体系结构的信息-内核数,堆大小和配置,因此可以根据此信息进行最佳选择。

但是,让我们在实践中看到这些假设。 我创建了一个小型测试应用程序 ,它使用几种不同的方法将1024个整数加在一起。

  • 相对合理的一种,其中实现仅对包含1024个整数的数组进行迭代,并将结果求和。 InlineSummarizer.java中提供了此实现。
  • 基于递归的分而治之方法。 我采用原始的1024个元素数组,然后将其递归分为两半,因此第一个递归深度为我提供了两个512个元素数组,第二个深度为四个256个元素数组,依此类推。 为了将所有1024个元素加在一起,我引入了1023个附加的方法调用。 此实现作为RecursiveSummarizer.java附加。
  • 天真的分而治之的方法。 这也划分了原始的1024个元素的数组,但是通过在分开的两半上调用其他实例方法–即,我嵌套了sum512(),sum256(),sum128(),…,sum2()调用,直到我总结了所有元素。 与递归一样,我在源代码中介绍了1023个其他方法调用。

我有一个测试班来运行所有这些示例。 最初的结果来自未优化的代码:

Statistics with JIT

从上面可以看出,内联代码是最快的。 而我们引入了1023个附加方法调用的方法则要慢25,000ns。 但是,此图像必须加以警告-它是JIT尚未完全优化代码的运行快照。 在我2010年中期的MB Pro中,根据实施情况,运行了200到3000次。

更现实的结果如下。 我已经运行了所有汇总器实现超过1,000,000次,并丢弃了JIT尚未成功执行的运行。

Statistics with JIT

我们可以看到,即使内联代码仍然表现最佳,但迭代方法也以相当快的速度飞速发展。 但是递归明显不同–当迭代方法仅以20%的开销关闭时,RecursiveSummarizer会花费内联代码需要完成的340%的时间。 显然,这是应该注意的事情–使用递归时,JVM是无助的,无法内联方法调用。 因此,在使用递归时请注意此限制。

除了递归-方法开销几乎不存在。 源代码中有1023个其他方法调用之间的时间差仅为205 ns。 请记住,那是我们用于测量的那纳秒(10 ^ -9 s)。 因此,借助JIT,我们可以安全地忽略方法调用带来的大部分开销。 下次当您的同事将糟糕的设计决策隐藏在通过调用堆栈弹出效率不高的声明后面时,请让他首先完成一个小的JIT崩溃过程 。 如果您希望有能力阻止他将来的荒唐言论,请订阅我们的RSS或Twitter提要,我们很高兴为您提供未来的案例研究。

全面披露:本文中使用的测试用例的灵感是由Tomasz Nurkiewicz 博客文章触发的。

参考: Plumbr博客博客上的JCG合作伙伴 Nikita Salnikov Tarnovski 用Java进行方法调用的成本是多少 ?

翻译自: https://www.javacodegeeks.com/2013/02/how-expensive-is-a-method-call-in-java.html

java调用怎么调用方法区

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

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

相关文章

python中的np array函数_numpy中的np.ascontiguousarray()函数

"Return a contiguous array (ndim > 1) in memory (C order)."用途ascontiguousarray函数将一个内存不连续存储的数组转换为内存连续存储的数组,使得运行速度更快。C order vs Fortran orderC order 指的是行优先的顺序(Row-major Order),…

OpenCV版本

#include <opencv2/opencv.hpp>using namespace cv;void main(){/*printf("\t当前使用的opencv版本为 OpenCV"CV_VERSION);getchar();*/std::cout << "\t当前使用的opencv版本为 OpenCV" << CV_VERSION << std::endl;system(&quo…

使用jstat的JVM统计信息

过去&#xff0c;我已经写过关于Oracle和/或OpenJDK Java开发工具包&#xff08;JDK&#xff09;随附的几个命令行工具的信息&#xff0c;但是我从来没有专门写过jstat工具 。 Oracle JDK 9文档Early Access指出jstat用于“监视Java虚拟机&#xff08;JVM&#xff09;统计信息”…

每天一点点之 taro 框架开发 - taro路由及传参

1.路由 taro的路由是自带的&#xff0c;不需要我们额外配置&#xff0c;只需要我们在app.js下config中配置pages即可 class App extends Component {config {pages: [pages/test/test,pages/index/index],} } 2.taro通过api实现跳转&#xff0c;替换 官网地址&#xff1a;taro…

调用支付jsapi缺少参数:total_fee_小程序支付问题怎么解决?

微信小程序开发的过程一定会遇到各种问题&#xff0c;最让人棘手的就是支付问题&#xff0c;因为没有支付做商城类似的小程序就没有办法完成最关键的一步。那么支付失败到底什么原因呢&#xff1f;一下子收集了几个错误类似&#xff0c;希望对你有帮助&#xff1a;No.1{err_cod…

Visual Stutio中win32控制台应用程序、win32项目、MFC项目的区别:

我的理解&#xff0c;我首先把这几个货分为两大类&#xff1b;第一类包括win32控制台应用程序&#xff0c;第二类就是剩下那俩货。而剩下那俩货又有一个包含关系&#xff0c;即win32项目包含mfc。&#xff08;我个人是这个区分的。&#xff09; 一、 区别: &#xff08;1&…

二分图匹配【模板】

传送门&#xff1a; #include <cstdio> #include <cstring> #include <cmath> using namespace std; #define ll long long #define re register const int N1005; inline void read(int &a) {a0;int d1;char ch;while(chgetchar(),ch>9||ch<0)if(…

c++两个数组对比去掉重复的元素_30 数组案例

数组案例案例一&#xff1a;筛选指定数组元素要求&#xff1a;将数组[2,0,6,1,77,0,52,0,25,7]中的0去掉后&#xff0c;形成一个不包含0的新数组。var arr [2,0,6,1,77,0,52,0,25,7];var newArr [];for(var i0; i<arr.length; i){if(arr[i]!0){newArr[newArr.length]arr[i…

排序并记录排序前的索引(类似matlab sort函数)

这里用到vector比较方便。 #include<iostream> #include<vector> #include<algorithm> using namespace std; struct num_label { int num; int label; }; //自定义“大于” bool comp(const num_label &a, const num_label &b) { return a.n…

selenium实现登录百度(自动识别简单验证码)

需要做的工作 0、工程结构 1、代码&#xff1a; ①baidu_login.py 1 import re2 import os3 import sys4 import time5 import random6 from selenium import webdriver7 from PIL import Image, ImageEnhance8 import pytesseract9 from func import base642str, str2base6410…

为什么猫王不应该访问Java

最近&#xff0c;我参与了一个关于Java的Optional类型系统的漫长的Twitter讨论 &#xff0c;该系统区分可空类型和非可空类型以及Elvis运算符 &#xff0c;该运算符允许选择空值安全的成员。 后者被认为是简洁的null处理的杀手级功能&#xff0c;对此我强烈不同意。 我对此的看…

python a and b_python-尽管Numpy建议a.b,为什么a.dot(b)比a @ b更...

根据question的答案,也根据numpy的答案,与a.dot(b)相比,二维数组的矩阵乘法最好通过a b或numpy.matmul(a,b)完成.If both a and b are 2-D arrays, it is matrix multiplication, but usingmatmul or a b is preferred.我做了以下基准测试,发现相反的结果.问题&#xff1a;我的…

Mysql高可用集群-解决MMM单点故障

目录 一.理论概述组件介绍三.部署四.测试五.总结preface: MMM架构相比于MHA来说各方面都逊色不少,写这篇案例也算是整理下思路吧. 一.理论概述 MMM(Master-Master replication Manager for MySQL) 是一套支持双主日常管理的脚本程序,使用Perl语言开发,主要用来监控和管理MySQL双…

vector元素的读取

1通过下标&#xff1a; int a[6] { 1,2,3,4,5,6 }; vector<int> b(a, a 4); for (int i 0; i < b.size() - 1; i) cout << b[i] << " "; 2通过迭代器 int a[6] { 1,2,3,4,5,6 }; vector<int> b(a, a 4); for (vector<int>:…

vector 中的元素去重

#include<iostream> #include<vector> #include<algorithm> using namespace std; int main() { cout << "********************一维向量*************************" << endl; vector<int> a; for (int i 0; i < 6; i) …

tcp的3次握手4次挥手

转载于:https://www.cnblogs.com/georgexu/p/10909808.html

python 如何定义字典_python dict如何定义

1.字典的定义字典的格式&#xff1a;字典名 {key1:value1, key2:value2,...}字典是无序的&#xff0c;是可变的数据类型字典的key不能是可变的数据类型(列表 字典)字典的key是不能重复的&#xff0c;但value可以例&#xff1a;my_dict {"name": "小明", …

MS SQL JSON类型type

在MS SQL Server 2016&#xff0c;已经支持JSON处理。 执行下面代码&#xff0c;将获取ms sql server对象类型以及其说明: IF OBJECT_ID(tempdb.dbo.#json_type) IS NOT NULL DROP TABLE #json_typeCREATE TABLE #json_type ( [type] TINYINT,[data_type] NVARCHAR(30) ) IN…

Eigen(8)实例最小二乘法

用Eigen库解Axb线性方程&#xff0c;使用最小二乘法 #include <iostream>#include <Eigen/Dense>using namespace std;using namespace Eigen;int main(){//对方程AxbMatrixXf A MatrixXf::Random(3, 2);std::cout << "Here is the matrix A:\n"…

java 和javafx_JavaFX 2 XYCharts和Java 7功能

java 和javafx我最喜欢的JavaFX 2功能之一是它在javafx.scene.chart包中提供的标准图表。 该软件包提供了几种不同类型的现成图表。 除其中之一&#xff08; PieChart &#xff09;外&#xff0c;所有其他均为“ 2轴图”&#xff08; XYChart的特定实现&#xff09;。 在本文中…