if 与条件条件相比的速度

2024-01-06

我的想法是使用条件运算符将一些 if 块转换为单行。不过我想知道是否会有速度差异。我进行了以下测试:

static long startTime;
static long elapsedTime;
static String s;
    
public static void main(String[] args) {
    startTime = System.nanoTime();
    s = "";
    for (int i= 0; i < 1000000000; i++) {
        if (s.equals("")) {
            s = "";
        }
    }
    
    elapsedTime = System.nanoTime() - startTime;
    
    System.out.println("Type 1 took this long: " + elapsedTime + " ns");
    
    startTime = System.nanoTime();
    s = "";
    for (int i= 0; i < 1000000000; i++) {
        s = (s.equals("") ? "" : s);
    }
    
    elapsedTime = System.nanoTime() - startTime;
    
    System.out.println("Type 2 took this long: " + elapsedTime + " ns");
}

这是我的结果:

类型 1 花了这么长时间:3293937157 ns

类型 2 花了这么长时间:2856769127 ns

我在这里做错了什么吗?

假设s.equals("")必然是正确的,这是使代码更快的可行方法吗?


, is this a viable way to make your code faster?

如果您的,您甚至可以使其更快String s;是一个非静态场。当您进行以下操作时,静态字段比非静态字段慢referencing它十亿次

public static void main(String[] args) {

    startTime = System.nanoTime();
    String s = "";
    .
    .
}

EDIT:

为什么速度更快??

这是由于字符串引用了静态字段。

你可以在它的字节码中看到它

    0: ldc           #23                 // String
       2: putstatic     #25                 // Field s:Ljava/lang/String;
       5: iconst_0
       6: istore_1
       7: goto          22
      10: getstatic     #25                 // Field s:Ljava/lang/String;
      13: ldc           #23                 // String
      15: invokevirtual #27                 // Method java/lang/String.equals:(L
java/lang/Object;)Z
      18: pop
      19: iinc          1, 1
      22: iload_1
      23: ldc           #33                 // int 1000000000
      25: if_icmplt     10
      28: return

如你看到的getStatic and putStatic将被调用十亿次,它的作用是调用静态字段的引用并使用 putStatic 放置字符串的引用

获取静态- 获取一个类的静态字段值,该字段通过常量池索引中的字段引用来标识(index1

放置静态- 将静态字段设置为类中的值,其中该字段由常量池中的字段引用索引标识(indexbyte1

看看那些位移位这就是程序缓慢的原因

另外,如果您使用的是global/member field它将创建相同的bytecode但它会使用getfield and putfield与 static 相同getStatic and putStatic

现在让我们看看non static field字节码

      0: ldc           #21                 // String
       2: astore_1
       3: iconst_0
       4: istore_2
       5: goto          23
       8: aload_1
       9: ldc           #21                 // String
      11: invokevirtual #23                 // Method java/lang/String.equals:(L
java/lang/Object;)Z
      14: ifeq          20
      17: ldc           #21                 // String
      19: astore_1
      20: iinc          2, 1
      23: iload_2
      24: ldc           #29                 // int 1000000000
      26: if_icmplt     8
      29: return

正如你所看到的,它只使用astore_1 and aload_1无需额外操作即可保存和加载非静态字段的引用。

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

if 与条件条件相比的速度 的相关文章

  • 匿名内部类显示不正确的修饰符

    据我了解 以下代码应该打印true作为输出 但是 当我运行这段代码时 它正在打印false 来自 Java 文档15 9 5 匿名类 https docs oracle com javase specs jls se8 html jls 1
  • 使用 Gson 序列化时如何公开类名

    我的场景非常复杂 但总结如下 我试图了解编译器的源代码 并了解每个 AST 节点代表什么 我正在生成不同程序的 AST 的 JSON 序列化 然后检查可视化的 JSON 输出 它工作得很好 除了一个问题是在 Gson 中生成的 JSON 数
  • 包含小时、分钟和秒的周期[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我需要一个代表年 月 周 日 小时 分钟 秒的间隔数据类型 前三年 年 月 日 可以用Period最后
  • 无法解析配置“:app:debugRuntimeClasspath”的所有文件。问题

    我的 android studio 遇到了下一个问题 导致 org gradle api internal artifacts ivyservice DefaultLenientConfiguration ArtifactResolveEx
  • 按对象值分组,统计后按最大对象属性设置组键

    我设法使用 Java 8 Streams API 编写了一个解决方案 该解决方案首先按对象 Route 的值对列表进行分组 然后计算每组中的对象数量 它返回一个映射 Route gt Long 这是代码 Map
  • 如何在 Java 中安装附加包?

    我对 Java 很陌生 我想使用名为的包中的一些功能daj 教程代码有以下几行 import daj import java util import java lang Math import Msg 但第一行和第四行会产生红色下划线 导致
  • @NotNull.List 的目的

    当我查看标准时限制条件 http docs oracle com javaee 6 api javax validation constraints package summary html在 Bean Validation API JSR
  • Java 泛型和数字类型

    我想创建一个通用方法来有效地执行此操作 class MyClass static
  • 在 Java 5 及更高版本中迭代 java.util.Map 的所有键/值对的最简单方法是什么?

    在 Java 5 及更高版本中迭代 java util Map 的所有键 值对的最简单方法是什么 假设K是您的密钥类型 并且V是你的值类型 for Map Entry
  • 如何连接hibernate和DB2

    我正在运行一个使用 struts 和 hibernate 的应用程序 我目前正在使用 Derby 数据库 现在我必须转向 DB2 数据库 请告诉我 我必须做什么配置 休眠配置文件 我必须设置任何类路径吗 多变的 我知道 DB2 有两个 ja
  • 比较和删除列表和数组java中不存在的元素

    我有一个String数组和一List
  • 在 Java 中打开现有文件并关闭它。

    是否可以在java中打开一个文件附加数据并关闭多次 例如 psuedocode class variable declaration FileWriter writer1 new FileWriter filename fn1 writer
  • 如何在Webview中保存用户名和密码

    目前 我还在学习Android开发的过程中 所以如果我的这个问题对你来说不太容易理解 请原谅 我创建了一个 Android 应用程序 它使用 RecyclerView 显示一组列表 当用户单击列表中的每个名称时 它会将它们重定向到一组不同的
  • WebSocketStompClient 将无法连接到 SockJS 端点

    我正在尝试新的 从版本 4 2 开始 java STOMP 客户端支持 我的出发点是入门指南 使用 WebSocket 构建交互式 Web 应用程序 http spring io guides gs messaging stomp webs
  • 有时 Properties.load() 会跳过行

    在以下情况下 Properties load 会跳过 InputStream 的第二行 这是 Java 的错误还是正常行为 public class PropTest public static void main String args
  • 为什么 HttpServletRequest 输入流为空?

    我有这段代码 我从请求输入流读取输入并使用 JacksonMapper 转换为 POJO 它在具有 guice 支持的 jetty 7 容器中运行 Override protected void doPost HttpServletRequ
  • 如何将多部分文件从另一个服务发送到一个服务

    我有两个端点 api 它们是 uploadand 重定向 upload是我直接上传文件的地方 重定向是我接收文件并将其传递给上传并获取 JSON 响应的地方 upload 所以下面是我的代码 package com example impo
  • Android应用程序中的模式输入

    我想知道是否有其他替代方案可以替代 Android 上平庸的 EditText 密码输入 是否有 API 或开源代码可以集成到我的应用程序中 类似于锁屏图案解锁 Intent 可能会返回哈希值 数字 字符串或代表用户输入的模式的任何内容 我
  • 按字母顺序对对象的 ArrayList 进行排序

    我必须创建一个方法来排序数组列表根据电子邮件按字母顺序排列对象 然后打印排序后的数组 我在排序时遇到麻烦的部分 我已经研究过并尝试使用Collections sort vehiclearray 但这对我不起作用 我是因为我需要一个叫做比较器
  • 在Java的System.out中以表格格式输出

    我正在从数据库获取结果 并希望将数据作为 Java 标准输出中的表输出 我尝试过使用 t 但我想要的第一列的长度变化很大 有没有办法将其显示在类似输出的漂亮表格中 Use System out format http java sun co

随机推荐

  • 有没有办法在 C# 中抑制警告,类似于 Java 的 @SuppressWarnings 注释?

    有没有办法在 C 中抑制警告 类似于 Java 的 SuppressWarnings 注释 如果做不到这一点 是否有另一种方法可以抑制 Visual Studio 中的警告 Yes 如需禁用 请使用 pragma warning disab
  • Python:文件中的反斜杠(\u...)

    我有一个包含 u 格式的 unicode 字符的文件 我想将它们作为普通的 unicode 字符串写入另一个文件 但我无法将反斜杠解释为转义字符 所以我把它放在一个文件中 例如 u1203 u1208 u1208 u0074 u00E4 u
  • C++ 类函数应该以 } 结尾吗?或者只有一个}?

    关于 C 语法的基本问题 C 函数应该以 结尾吗 或者没关系 或者这两个例子有什么区别 有结局 void Test print 没有 void Test print 我见过有或没有的 C 代码 但我不明白有什么区别 Thanks Updat
  • 如何将 xsd 转换为人类可读的文档? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们有一些基于 XML 的接口 这些接口在 XSD 模式中得到了很好的记录 这些接口现在将公开 我们希望为它们创建参考文档 有没有一个工具
  • java 8 中删除 JDBC ODBC 桥

    从 Java 8 开始 JDK 将不再包含 JDBC ODBC Bridge Class forName sun jdbc odbc JdbcOdbcDriver classNotFoundException is thrown 还有其他连
  • 在 PictureBox 中绘制火车时,C# 中出现内存不足异常

    我正在尝试创建一个应用程序来显示在线火车picturebox 所以为了实现这个我创建了一个worker thread为了获得在线火车位置 所以我定义了线程 如下所示 private Thread workerThread null priv
  • 应如何实施电子邮件地址选择加入?

    设想 用户给您一个电子邮件地址 在他们注册服务之前 他们需要验证电子邮件地址 您通过电子邮件发送一个 URL 他们单击它 然后他们就可以订阅服务 问题 网址是什么样的 我认为随机指南就可以了 您是否使用相同的随机密钥来取消订阅请求 我应该考
  • boost 正则表达式中的链接器错误

    我想了解有关 boost lib 中的正则表达式的一些知识 我尝试编译这个简单的示例代码 regex search example include
  • Scala 2.10.1 中新的脱糖行为

    假设我有这个单子类 case class Foo A xs List A def map B f A gt B Foo xs map f def flatMap B f A gt Foo B Foo xs flatMap f andThen
  • 使用 App Engine SDK 进行并行模块部署

    TL DR 有没有办法并行部署 App Engine 模块 我使用 Google 构建了一个 go 应用程序适用于 Go 的 App Engine SDK https cloud google com appengine downloads
  • Async Await 等待所有结果并继续

    我对如何实现异步等待方法并在继续之前等待结果有点困惑 我想并行对后端进行 3 次调用 并等待它们响应 然后获取结果并在内部分配它们 像这样的事情 Private Sub GetParseExpressionResults If Not is
  • iOS Core Data:将获取请求的结果转换为数组

    我正在尝试将获取请求的结果放入数组中 我的代码 let appDelegate UIApplication sharedApplication delegate as AppDelegate let managedContext appDe
  • 在 PostgreSQL 中提取 xml 标签的值

    下面是我的 Postgres 表的列响应 我想从 Postgres 数据库中的所有行中提取状态 状态的大小可能不同 例如SUCCESS所以我不想使用子字符串函数 有办法做到吗
  • 实时显示 Google Analytics 数据

    我想显示自本月初以来网站上的访问者数量 当天和当前在网站上的用户数量 我安装了 Google Analytics 我尝试通过从开发人员控制台启用 Google Analytics API 来使用嵌入 API 来解决此问题 但我需要用户授权等
  • ES6模块的“导入”正式兼容CommonJS和AMD?

    从这篇文章 https hacks mozilla org 2015 08 es6 in deep modules https hacks mozilla org 2015 08 es6 in depth modules 文中写道 新标准旨
  • iPhone如何自动插入小数位?

    我知道过去曾多次问过这个问题 但我尝试的一切都失败了 我有一个带有 UILabel 的自定义数字键盘 当我点击 1 时 UILabel 显示一个 1 现在这就是我想做的 当我点击 1 按钮时 我想要 UILabel 中的 0 01 接下来是
  • 这是什么意思? “解析错误:语法错误,意外的 T_PAAMAYIM_NEKUDOTAYIM”

    T PAAMAYIM NEKUDOTAYIM 听起来确实很异国情调 但对我来说绝对是胡说八道 我将其全部追溯到这行代码 在构造函数中我创建了一个 Config 对象 这是课程 final c
  • 单例中的 Spring Prototype 作用域 bean

    我正在尝试注入prototype豆子在一个singleton这样 每次对单例 bean 方法的新调用都会有一个原型 bean 的新实例 考虑一个单例 bean 如下所示 Component public class SingletonBea
  • 停止正在运行的 SKAction - Sprite Kit

    以下代码将为旋转设置动画 let something SKSpriteNode SKSpriteNode func start let rotateAction SKAction rotateToAngle CGFloat M PI dur
  • if 与条件条件相比的速度

    我的想法是使用条件运算符将一些 if 块转换为单行 不过我想知道是否会有速度差异 我进行了以下测试 static long startTime static long elapsedTime static String s public s