最小化 Java 函数调用开销

2023-12-02

I have 一段代码在我运行的每个测试中,函数调用都会产生大量开销。该代码是一个紧密循环,对数组(包含 4-800 万个元素)的每个元素执行一个非常简单的函数ints).

运行代码,主要包括

for (int y = 1; y < h; ++y) {
    for (int x = 1; x < w; ++x) {
        final int p = y * s + x;
        n[p] = f.apply(d, s, x, y);
    }
}

执行类似的事情

(final int[] d, final int s, final int x, final int y) -> {
    final int p = s * y + x;
    final int a = d[p] * 2
                + d[p - 1]
                + d[p + 1]
                + d[p - s]
                + d[p + s];
    return (1000 * (a + 500)) / 6000;
};

在各种机器上(我的工作笔记本电脑、配备 i7 3840QM 的 W530、配备一个 Xeon E5-1620 核心的服务器虚拟机,以及配备一个未知 CPU 核心的 Digital Ocean 节点),当我调用方法与内联。所有测试均在 Java 1.8.0_11(Java HotSpot(TM) 64 位服务器 VM)上执行。

工作机:

Benchmark                               Mode   Samples        Score  Score error    Units
c.s.q.ShaderBench.testProcessInline    thrpt       200       40.860        0.184    ops/s
c.s.q.ShaderBench.testProcessLambda    thrpt       200       22.603        0.159    ops/s
c.s.q.ShaderBench.testProcessProc      thrpt       200       22.792        0.117    ops/s

专用服务器、虚拟机:

Benchmark                               Mode   Samples        Score  Score error    Units
c.s.q.ShaderBench.testProcessInline    thrpt       200       40.685        0.224    ops/s
c.s.q.ShaderBench.testProcessLambda    thrpt       200       16.077        0.113    ops/s
c.s.q.ShaderBench.testProcessProc      thrpt       200       23.827        0.088    ops/s

DO VPS:

Benchmark                               Mode   Samples        Score  Score error    Units
c.s.q.ShaderBench.testProcessInline    thrpt       200       24.425        0.506    ops/s
c.s.q.ShaderBench.testProcessLambda    thrpt       200        9.643        0.140    ops/s
c.s.q.ShaderBench.testProcessProc      thrpt       200       13.733        0.134    ops/s

所有性能都可以接受,但我有兴趣弄清楚为什么调用有如此大的开销以及可以采取哪些措施来优化它。目前正在尝试不同的参数集。

内联所有潜在的操作会很困难,但理论上是可能的。对于接近 2 倍的性能提升来说,这可能是值得的,但维护将是一场噩梦。

我不确定是否有合理的方法来批量处理一组重复;大多数操作采用多个输入(调用者未知)并产生单个输出。

我还有哪些其他选择可以最大限度地减少开销并提高晚上的性能?


方法调用不是问题,因为热方法通常是内联的。 Avirtual通话是一个问题。

在您的代码中,类型分析器被初始化方法愚弄了Image.random. When Image.process首次进行JIT编译,针对调用进行了优化random.nextInt()。所以接下来的调用Image.process将导致内联缓存未命中,然后是对以下内容的非优化虚拟调用Shader.apply.

  1. 删除一个Image.process从初始化方法调用,然后 JIT 会将有用的调用内联到Shader.apply.

  2. After BlurShader.apply内联可以帮助JIT执行公共子表达式消除通过替换优化

    final int p = s * y + x;
    

    with

    final int p = y * s + x;
    

    后一个表达式也满足于Image.process,所以 JIT 不会计算相同的表达式两次。

应用这两项更改后,我获得了理想的基准分数:

Benchmark                           Mode   Samples         Mean   Mean error    Units
s.ShaderBench.testProcessInline    thrpt         5       36,483        1,255    ops/s
s.ShaderBench.testProcessLambda    thrpt         5       36,323        0,936    ops/s
s.ShaderBench.testProcessProc      thrpt         5       36,163        1,421    ops/s
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最小化 Java 函数调用开销 的相关文章

  • 如何在 Antlr4 中为零参数函数编写语法

    我的函数具有参数语法 如下面的词法分析器和解析器 MyFunctionsLexer g4 lexer grammar MyFunctionsLexer FUNCTION FUNCTION NAME A Za z0 9 DOT COMMA L
  • Java:在 eclipse 中导出到 .jar 文件

    我正在尝试将 Eclipse 中的程序导出到 jar 文件 在我的项目中 我添加了一些图片和 PDF s 当我导出到 jar 文件时 似乎只有main已编译并导出 我的意愿是如果可能的话将所有内容导出到 jar 文件 因为这样我想将其转换为
  • GWT - 如何组织项目以拥有多个网页以及它们之间的导航

    我是 GET 的新手 顺便说一句 它给我留下了深刻的印象 并且发现它对于像我这样熟悉 C NET 桌面技术并愿意编写 Web 应用程序的人来说非常有吸引力 我根据 GWT Eclipse 向导生成的示例启动了自己的项目 该项目生成带有面板的
  • 是否可以使用 Flying Saucer (XHTML-Renderer) 将 css 解析为类路径资源?

    我正在尝试将资源打包到 jar 中 但我无法让 Flying Saucer 在类路径上找到 css 我无法轻松构建 URL 来无缝解决此问题 https stackoverflow com questions 861500 url to l
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 如何检测 Java 字符串中的 unicode 字符?

    假设我有一个包含 的字符串 我如何找到所有这些 un icode 字符 我应该测试他们的代码吗 我该怎么做呢 例如 给定字符串 A X 我想将其转换为 AYXY 我想对其他 unicode 字符做同样的事情 并且我不想将它们存储在某种翻译映
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • 在另一个模块中使用自定义 gradle 插件模块

    我正在开发一个自定义插件 我希望能够在稍后阶段将其部署到存储库 因此我为其创建了一个独立的模块 在对其进行任何正式的 TDD 之前 我想手动进行某些探索性测试 因此 我创建了一个使用给定插件的演示模块 到目前为止 我发现执行此操作的唯一方法
  • 了解joda时间PeriodFormatter

    我以为我明白了 但显然我不明白 你能帮我通过这些单元测试吗 Test public void second assertEquals 00 00 01 OurDateTimeFormatter format 1000 Test public
  • 为什么 Web Worker 性能在 30 秒后急剧下降?

    我正在尝试提高在网络工作人员中执行时脚本的性能 它旨在解析浏览器中的大型文本文件而不会崩溃 一切都运行得很好 但我注意到使用网络工作者时大文件的性能存在严重差异 于是我做了一个简单的实验 我在同一输入上运行脚本两次 第一次运行在页面的主线程
  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如
  • 使用架构注册表对 avro 消息进行 Spring 云合约测试

    我正在查看 spring 文档和 spring github 我可以看到一些非常基本的内容examples https github com spring cloud samples spring cloud contract sample
  • 返回 Java 8 中的通用函数接口

    我想写一种函数工厂 它应该是一个函数 以不同的策略作为参数调用一次 它应该返回一个函数 该函数根据参数选择其中一种策略 该参数将由谓词实现 嗯 最好看看condition3为了更好的理解 问题是 它没有编译 我认为因为编译器无法弄清楚函数式
  • Hamcrest Matchers - 断言列表类型

    问题 我目前正在尝试使用 Hamcrest Matchers 来断言返回的列表类型是特定类型 例如 假设我的服务调用返回以下列表 List
  • 哪些属性有助于运行时 .Net 性能?

    我正在寻找可用于通过向加载器 JIT 编译器或 ngen 提供提示来确保 Net 应用程序获得最佳运行时性能的属性 例如我们有可调试属性 http msdn microsoft com en us library k2wxda47 aspx
  • OpenCSV:将嵌套 Bean 映射到 CSV 文件

    我正在尝试将 bean 映射到 CSV 文件 但问题是我的 bean 具有其他嵌套 bean 作为属性 所发生的情况是 OpenCSV 遍历属性找到一个 bean 然后进入其中并映射该 bean 内的所有数据 如果找到另一个 bean 它就
  • 将 Apache Camel 执行器指标发送到 Prometheus

    我正在尝试转发 添加 Actuator Camel 指标 actuator camelroutes 将交换 交易数量等指标 发送到 Prometheus Actuator 端点 有没有办法让我配置 Camel 将这些指标添加到 Promet
  • 配置“DataSource”以使用 SSL/TLS 加密连接到 Digital Ocean 上的托管 Postgres 服务器

    我正在尝试托管数据库服务 https www digitalocean com products managed databases on 数字海洋网 https en wikipedia org wiki DigitalOcean 创建了
  • 在java中使用多个bufferedImage

    我正在 java 小程序中制作游戏 并且正在尝试优化我的代码以减少闪烁 我已经实现了双缓冲 因此我尝试使用另一个 BufferedImage 来存储不改变的游戏背景元素的图片 这是我的代码的相关部分 public class QuizApp

随机推荐

  • 在 Python 中生成随机十六进制颜色

    对于 Django 应用程序 每个 成员 都被分配了一种颜色以帮助识别它们 它们的颜色存储在数据库中 然后在需要时打印 复制到 HTML 中 唯一的问题是我不确定如何生成随机数Hexpython django 中的颜色 生成 RGB 颜色很
  • 如何使用预加载器和多个图像显示加载状态?

    我正在构建一个包含数百张图像的幻灯片 并希望构建一个漂亮的加载栏 因此我的想法是使用 JavaScript 预加载图像 然后初始化 UI 的其余部分 预加载图像不是问题 但让浏览器在加载时更新状态才是问题 我已经尝试了一些方法 但浏览器只会
  • 在Rails中,是否可以限制谁可以使用api登录google?

    是否可以只允许某些谷歌帐户登录 例如 email protected 是通过谷歌托管 他们实际上是谷歌帐户 我只想要用户 mycompany能够登录这可能吗 你用 devise 还是 google api 来做这个 谢谢 如果您正在使用om
  • 当键在字典中时出现键错误

    只是试图从一堆照片的 EXIF 数据中提取一些纬度 经度信息 但代码抛出了一个KeyError即使稍后 成功 使用该键来打印特定坐标 有问题的字典是 tags GPS GPSLatitude and GPS GPSLongitude 都是键
  • NSMutableArray 中的lastObject 是否返回对象的副本?

    我有一个与这段代码相关的问题 NSNumber lastObject self myStack lastObject if lastObject self myStack removeLastObject return lastObject
  • 点击事件时清除 QLineEdit

    我正在使用给定的代码 我希望用户在 QLineEdit 小部件中输入文本 然后按复制 按钮并看到输入的文本替换了 N A 标签 我的问题是 按照此过程 如何通过简单的鼠标单击清除 QLineEdit 小部件中输入的文本 从我读到的 this
  • 旋转方法已弃用,相当于“didRotateFromInterfaceOrientation”?

    我正在尝试实施新的viewWillTransitionToSizeiOS 8 中引入的方法 所有其他旋转方法已被弃用 我想知道相当于什么didRotateFromInterfaceOrientation现在是因为我们需要执行许多清理任务 但
  • 为什么我们不能使用 new 关键字创建活动?

    为什么我们必须使用意图来启动活动 为什么我们不能使用 Activity a new Activity 启动它 我尝试在android开发者中搜索但没有得到任何答案 可以 但它不会完全初始化 Activity 上有一系列函数需要以正确的顺序调
  • Java - 私有和包私有枚举构造函数之间的区别[重复]

    这个问题在这里已经有答案了 最近我经常使用枚举 所以我想知道 私有枚举构造函数和没有任何可见性修饰符的枚举构造函数 包私有 之间有什么区别吗 枚举的构造函数是隐式的private 就像接口和注释的方法是隐式的public abstract
  • 如何在运行时正确压缩 UIImages

    我需要加载 4 个图像进行同时编辑 当我从用户库加载它们时 内存超过 500mb 并且崩溃 以下是我尝试进行任何压缩之前原始分配转储的日志 Code var pickedImage UIImage data imageData Instru
  • 如何从我的应用程序打开标准 Google 地图应用程序?

    一旦用户按下我的应用程序中的按钮 我想打开标准的 Google 地图应用程序并显示特定位置 我该怎么做 不使用com google android maps MapView 你应该创建一个Intent具有 geo URI 的对象 Strin
  • LibGDX 保存纹理以避免上下文丢失

    我的基于 LibGDX 的 Android 应用程序中有一个纹理 它是通过 FrameBuffers 按程序创建的 我需要通过上下文丢失来保留它 而且似乎唯一有效的方法就是简单地保存数据 无论是作为完整图像还是原始图像数据 输出 并在时间到
  • 使用 spring security 自定义注释

    我已阅读 Spring Security 文档 并了解到我可以使用以下注释来检查主题是否有权编辑用户 PreAuthorize hasPermission USER EDIT public String editUSer User user
  • 如何计算文本字符串中的单词数?

    在 iOS 上 如何计算特定文本字符串中的单词数 比拆分更有效的方法是逐个字符检查字符串 int word count NSString s CFCharacterSetRef alpha CFCharacterSetGetPredefin
  • 在 Angular js 中调用 $sce.trustAsHtml() 字符串内的函数

    我正在使用 Angularjs 开发一个应用程序并添加HTML using sce trustAsHtml 在我的页面中 我想在上面动态添加的内容中调用一个函数 我的 html 和脚本如下 HTML div div p p div div
  • HTML 字段集内容在 100% 高度溢出 (Chrome)

    我的 HTML 有问题fieldsetChrome 中的元素 我想要一个固定高度fieldset 其中有一个可滚动的div 一切看起来都很好 直到我把legend 当我这样做时 div从底部溢出fieldset 我还在 Firefox 中进
  • Python 3 包和脚本中导入的最佳实践

    考虑这个简单的文件夹结构 root Package1 x py y py Package2 z py Examples main py 现在我们的要求是 x py需要导入y py z py需要导入y py main py需要导入y py和z
  • “main”通常是一个非静态函数错误

    显示两个错误 main c 80 警告 main 通常是一个非静态函数 main c 88 错误 输入末尾处的预期声明或语句 我似乎找不到问题 花括号的数量是相等的 似乎是什么问题 include
  • SQL - 从一组结果中选择唯一的行

    我为这个问题绞尽脑汁已经有一段时间了 我还审查了其他问题 但没有成功 我遇到的问题是 我有一个结果 表列表 其中包含多行和列 注册 ID 日期 单位类型 005DTHGP 172 172 2007 09 11 生物酶 005DTHGP 19
  • 最小化 Java 函数调用开销

    I have 一段代码在我运行的每个测试中 函数调用都会产生大量开销 该代码是一个紧密循环 对数组 包含 4 800 万个元素 的每个元素执行一个非常简单的函数ints 运行代码 主要包括 for int y 1 y lt h y for