如果分析器不是答案,我们还有什么其他选择?

2024-04-08

看完Joshua Bloch的演讲《绩效焦虑》后,我读了他在演讲中建议的论文“评估 Java 分析器的准确性” http://www-plan.cs.colorado.edu/klipto/mytkowicz-pldi10.pdf。引用结论:

我们的结果令人不安,因为它们表明分析器的错误是普遍存在的——在我们的七个基准测试和两个生产 JVM 中的大多数中都发生过——而且很重要——所有四个基准测试中都出现了这种错误。 最先进的分析器会产生不正确的分析。不正确 配置文件很容易导致性能分析师花时间优化对性能影响最小的冷​​方法。 我们展示了一个不使用产量的概念验证分析器 采样点不会遇到上述问题

论文的结论是我们不能真正相信分析器的结果。但是,使用分析器的替代方案是什么?我们是不是应该回去凭感觉去做优化呢?

UPDATE: 讨论中似乎忽略了一点观察者效应。我们可以构建一个真正的分析器吗?观察者效应'-free?


哦,伙计,从哪里开始呢?

首先,我很惊讶这是新闻。其次,问题不在于分析器不好,而在于some分析器很糟糕。 作者构建了一个他们认为很好的模型,只是避免了他们在评估中发现的一些错误。 由于一些持续存在的原因,错误很常见关于性能分析的误解 http://archive.today/9r927.

但我们要积极一点。 如果想找到加速的机会,其实很简单:

  • 抽样应为不相关的与程序的状态。
    这意味着发生在真正随机的时间,无论程序是在 I/O(用户输入除外)中,还是在 GC 中,或者在紧密的 CPU 循环中,或者其他什么中。

  • 抽样应读取函数调用堆栈,
    以确定在采样时哪些语句是“活跃的”。 原因是每个调用点(调用函数的点)的成本百分比等于其在堆栈上的时间比例。 (注:论文完全关注自时间,忽略了大型软件中可避免函数调用的巨大影响。事实上,最初背后的原因gprof是为了帮助找到这些电话。)

  • 报告应显示按行百分比(不是按功能)。
    如果识别出“热门”函数,人们仍然必须在其中寻找占时间的“热门”代码行。该信息是在样本中!为什么要隐藏它?

一个几乎普遍的错误(这篇论文也提到了)是过于关注计算的准确性。测量,并且精度不够location。 例如,这里有一个性能调优示例 https://stackoverflow.com/questions/926266/performance-optimization-strategies-of-last-resort/927773#927773其中发现并修复了一系列性能问题,复合加速达 43 倍。 在解决每个问题之前,不一定要准确地知道问题的大小,但要知道问题的位置。 性能调优的一个现象是,通过减少解决一个问题的时间,放大了剩余问题的百分比,因此更容易发现它们。 只要any问题被发现并解决,朝着发现并解决所有问题的目标取得进展。 不一定要按尺寸递减的顺序修复它们,但必须精确定位它们。

关于测量的统计准确性,如果调用点在堆栈上的时间百分比为 F(例如 20%),并且采用 N(例如 100)个随机时间样本,则显示调用的样本数点是二项式分布,平均值 = NF = 20,标准差 = sqrt(NF(1-F)) = sqrt(16) = 4。因此显示该点的样本百分比将为 20% +/- 4% 。 那么这准确吗?确实没有,但是问题找到了吗?恰恰。

事实上,就百分比而言,问题越大,定位它所需的样本就越少。例如,如果采集了 3 个样本,其中 2 个样本上出现了调用点,则成本很可能非常高。 (具体来说,它遵循 beta 分布。如果生成 4 个均匀的 0,1 随机数并对它们进行排序,则第 3 个的分布就是该调用点的成本分布。 其平均值为 (2+1)/(3+2) = 0.6,因此这是给定这些样本的预期节省。) 插入:您获得的加速因子受另一个分布控制,贝塔Prime https://scicomp.stackexchange.com/a/2719/1262, and its平均值为 4。因此,如果您取 3 个样本,发现其中 2 个样本存在问题,并消除该问题,平均而言,您将使程序速度提高四倍。

现在是我们程序员对分析主题的困惑的时候了。

免责声明 - 该论文未能引用我的文章:Dunlavey,“通过调用堆栈采样派生的指令级成本进行性能调整”,ACM SIGPLAN 公告 42, 8(2007 年 8 月),第 4-8 页。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果分析器不是答案,我们还有什么其他选择? 的相关文章

  • Java:无法从同一包中的不同类访问静态变量

    这很奇怪 因为我有一个可以访问 Frame dimension getWidth 的 Character 类 及其伙伴 getHeight 但是当我想在 Map 类中使用它时 Eclipse 强调了它并且无法给我反馈 运行该程序最终会出现
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • 如何在 Antlr4 中为零参数函数编写语法

    我的函数具有参数语法 如下面的词法分析器和解析器 MyFunctionsLexer g4 lexer grammar MyFunctionsLexer FUNCTION FUNCTION NAME A Za z0 9 DOT COMMA L
  • 如何在代理后面安装 Eclipse Neon

    对于 Neon Eclipse 附带了一个安装程序 我在安装程序中找不到任何配置菜单 我的java版本是 java version java version 1 8 0 72 Java TM SE Runtime Environment b
  • Jackson XML ArrayList 输出具有两个包装器元素

    我在 Jackson 生成的 XML 输出中得到了两个包装器元素 我只想拥有一个 我有一个 Java bean Entity Table name CITIES JacksonXmlRootElement localName City pu
  • 自动生成Flyway的迁移SQL

    当通过 Java 代码添加新模型 字段等时 JPA Hibernate 的自动模式生成是否可以生成新的 Flyway 迁移 捕获自动生成的 SQL 并将其直接保存到新的 Flyway 迁移中 以供审查 编辑 提交到项目存储库 这将很有用 预
  • 如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

    我有一个返回 sys refcursor 的 Oracle 函数 当我使用 Hibernate 调用该函数时 出现以下异常 Hibernate call my function org hibernate exception Generic
  • 迭代列表的奇怪速度差异

    我创建了两个重复两个不同值的长列表 在第一个列表中 值交替出现 在第二个列表中 一个值出现在另一个值之前 a1 object object 10 6 a2 a1 2 a1 1 2 然后我迭代它们 不对它们执行任何操作 for in a1 p
  • 了解joda时间PeriodFormatter

    我以为我明白了 但显然我不明白 你能帮我通过这些单元测试吗 Test public void second assertEquals 00 00 01 OurDateTimeFormatter format 1000 Test public
  • Java实现累加器类,提供Collector

    A Collector具有三种通用类型 public interface Collector
  • 使用架构注册表对 avro 消息进行 Spring 云合约测试

    我正在查看 spring 文档和 spring github 我可以看到一些非常基本的内容examples https github com spring cloud samples spring cloud contract sample
  • Docker 和 Eureka 与 Spring Boot 无法注册客户端

    我有一个使用 Spring Boot Docker Compose Eureka 的非常简单的演示 我的服务器在端口 8671 上运行 具有以下应用程序属性 server port 8761 eureka instance prefer i
  • “无法实例化活动”错误

    我的一个 Android 应用程序拥有大约 100 000 个用户 每周大约 10 次 我会通过 Google 的市场工具向我报告以下异常情况 java lang RuntimeException Unable to instantiate
  • Spring-ws:如何从没有“Request”元素的 xsd 创建 Wsdl

    尝试为客户端实现 SOAP Web 服务 我需要一个 wsdl 文件来通过soapUI 测试该服务 但正如您在下面看到的 这个 xsd 没有 Request 和 Response 方法 所有请求和响应都被定义为基本 ServiceProvi
  • 在 C 中复制两个相邻字节的最快方法是什么?

    好吧 让我们从最明显的解决方案开始 memcpy Ptr const char a b 2 调用库函数的开销相当大 编译器有时不会优化它 我不会依赖编译器优化 但即使 GCC 很聪明 如果我将程序移植到带有垃圾编译器的更奇特的平台上 我也不
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • 将 Apache Camel 执行器指标发送到 Prometheus

    我正在尝试转发 添加 Actuator Camel 指标 actuator camelroutes 将交换 交易数量等指标 发送到 Prometheus Actuator 端点 有没有办法让我配置 Camel 将这些指标添加到 Promet
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复
  • 在java中使用多个bufferedImage

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

    对于Linux下包含少量字节的文件 我只需要处理自上次处理以来发生更改的时间 我通过调用 PHP 检查文件是否被更改clearstatcache filemtime 定期 由于整个文件总是很小 因此删除对 filemtime 的调用并通过将

随机推荐

  • Vim:突出显示每种文件类型的 TODO 一词

    我想在 vim 中突出显示 TODO 这个词 无论编辑什么文件 代码或普通文本 它目前适用于许多不同的语言 例如 默认情况下 TODO 在 C Java 注释中突出显示 但我将 vim 用于非代码文本文件 并且我希望看到它们也突出显示 TO
  • 使用 Hibernate 预防 SQL 注入

    我有一个现有的代码 其中应用程序根据许多条件生成不同的 sql 并通过 hibernate 会话 createSQLQuery 执行它们 在这里 参数与驻留在 java 类中的 sql 字符串连接 作为普通字符串替换 现在的问题是我需要防止
  • 运行 fatjar 时无法加载 log4j2

    我正在开发一个使用 log4j2 日志记录的项目 在 intellij 中开发时 一切正常 并且日志记录按预期完成 log4j2 xml 通过在启动时通过 intellij 设置传递给 jvm 的 java 属性进行链接 但是一旦我尝试运行
  • 如何在 GKE 上配置 Ingress 请求超时

    我目前在 GKE k8s 1 2 上配置了一个 Ingress 用于将请求转发到我的应用程序的 Pod 我有一个可能需要很长时间的请求 30秒 和我的应用程序超时 504 我观察到 这样做时 我收到的响应不是我自己的 504 而是来自看起来
  • 机架 Web 服务器和 https:教程?

    任何人都可以提供使用 Ruby RACK Web 服务器处理 https 和 installint 证书等设置的描述或教程的链接吗 Thanks Rack 不是网络服务器 它是网络服务器 如 Apache nginx 和应用程序中间件之间的
  • 我可以获得`FILE*`的访问模式吗?

    我必须复制一个FILE Mac OS X 上的 C 语言 使用 POSIXint不幸的是 文件描述符一直是不可能的 所以我想出了以下函数 static FILE fdup FILE fp const char mode int fd fil
  • iPhone X中为什么页面推送动画Tabbar上移

    我构建了一个应用程序演示 在推送动画中使用 hidesBottomBarWhenPushed 隐藏 Tabbar But When I click Jump Button Tabbar move up like this VoidLess
  • 用于具有数字签名的 WSSecurity 的 SOAPHandler

    我正在尝试在 java 中创建一个 Soap 客户端 我必须使用我的私钥对 Soap 消息进行签名 我正在使用得到回复SoapUI with WS Security配置 我已导入 WSDL 并使用生成的类wsimport 我创建了一个SOA
  • 要安装 OpenType 字体,Windows 有哪些要求?

    利基编程问题 我正在通过字节制作来开发 OpenType 字体 而不是使用 Fontlab 或 FontForge 等设计工具 现在有一个自定义 OpenType CFF 字体 它实现了 Basic Latin unicode 块的子集 特
  • 让宏定义为函数返回值是不好的做法吗?

    使用定义为有条件返回值的宏有一个缺点 即仅查看客户端代码可能会在宏处退出 这一点并不明显 我正在考虑的用例是编写值和错误检查 如下所示 define WRITE CHK file param if write that returns ze
  • POST 请求中的 %5B 和 %5D 代表什么?

    我正在尝试编写一个Java 类来登录某个网站 登录的POST请求中发送的数据是 user 5Blogin 5D username user 5Bpassword 5D 123456 我很好奇是什么 5B and 5D意味着在钥匙用户登录 我
  • AWS Redis 从外部连接

    有没有办法从外部 AWS 网络连接 AWS 上托管的 Redis 实例 我有一个基于 Windows 的 EC2 实例在 AWS 上运行 另一个是 Redis 缓存节点 我知道有人问过这个问题 但答案是在基于 Linux 的系统中 但我的是
  • 在 PL/SQL 存储过程中拆分逗号分隔的字符串

    我有 CSV 字符串 100 01 200 02 300 03 我需要将其传递给 Oracle 中的 PL SQL 存储过程 在过程中 我需要将这些值插入表中的数字列中 为此 我从这里得到了一个工作方法 如何在 oracle 9i 中最好地
  • PHP MYSQL - 根据行号是否匹配行号填充 HTML 表编号行

    所以 基本上我正在尝试制作数据中心驾驶室图 我们有一个 Excel 电子表格 但它不容易更新 也不容易搜索 我的 MySQL 数据库中有三个表 数据库是 机架 表格是 机柜 设备和数据中心 每个表格中的每一行代表它是什么 机柜表有一列指定其
  • 如何中断无限循环

    虽然我知道这样问有点傻 但我仍然想更多地了解它的技术角度 无限循环的一个简单示例 public class LoopInfinite public static void main String args for System out pr
  • 使用 Iframe 的自定义用户代理

    是的 我已经读过使用不同的用户代理加载 iframe 内容 https stackoverflow com questions 12845445 load iframe content with different user agent但我
  • PhantomJS 在评估之前更改网页内容

    我想在评估 渲染网页之前删除 HTML 元素或简单地删除网页的前 N 个字符 有什么办法可以做到这一点吗 这取决于多种场景 我将仅概述以下问题的每种答案组合的步骤 是不是有一段JS叫做onload ol 或者脚本块立即被评估 ie 它是内联
  • 使用 JavaScript 进行地理位置定位

    我正在编写一个脚本来获取地理位置 纬度 经度 我可以使用它来将我的谷歌地图实例居中 目前我使用两种可能的技术 其一是google loader ClientLocation目的 我还没有测试过这个 因为它为我返回 null 我想是因为我不住
  • 使用内置显卡,没有NVIDIA显卡,可以使用CUDA和Caffe库吗?

    使用内置显卡 没有 NVIDIA 显卡 可以使用 CUDA 和 Caffe 库吗 我的操作系统是 ubuntu 15 CPU为 Intel i5 4670 3 40GHz 4核 内存为12 0GB 我想开始学习深度学习 CUDA 适用于 N
  • 如果分析器不是答案,我们还有什么其他选择?

    看完Joshua Bloch的演讲 绩效焦虑 后 我读了他在演讲中建议的论文 评估 Java 分析器的准确性 http www plan cs colorado edu klipto mytkowicz pldi10 pdf 引用结论 我们