for循环的表达式中调用方法的效率问题

先看代码:
  1. public class Test {
  2.     public static void main(String[] args) {
  3.         for (int i = 0; i < get(); i++) {
  4.             System.out.println("Hello world");
  5.         }
  6.         System.out.println("-----------");
  7.         int k = get();
  8.         for (int i = 0; i < k; i++) {
  9.             System.out.println("test2");
  10.         }
  11.     }
  12.     public static int get() {
  13.         return 5;
  14.     }
  15. }
问题:两个循环表达式哪个的效率更高一些?

      一般写程序的时候用第一种方式的情况较少,这是基本的编程风格要求之一。但是效率有何差别? 根据编译原理上的知识,编译器有可能对这种运算进行优化。测试了一下:
  1. Compiled from "Test.java"
  2. public class Test extends java.lang.Object{
  3. public Test();
  4.   Code:
  5.    0:   aload_0
  6.    1:   invokespecial   #1//Method java/lang/Object."<init>":()V
  7.    4:   return
  8. public static void main(java.lang.String[]);
  9.   Code:
  10.    0:   iconst_0
  11.    1:   istore_1
  12.    2:   iload_1
  13.    3:   invokestatic    #2//Method get:()I
  14.    6:   if_icmpge   23
  15.    9:   getstatic   #3//Field java/lang/System.out:Ljava/io/PrintStream;
  16.    12:  ldc #4//String Hello world
  17.    14:  invokevirtual   #5//Method java/io/PrintStream.println:(Ljava/lang/String;)V
  18.    17:  iinc    11
  19.    20:  goto    2
  20.    23:  getstatic   #3//Field java/lang/System.out:Ljava/io/PrintStream;
  21.    26:  ldc #6//String -----------
  22.    28:  invokevirtual   #5//Method java/io/PrintStream.println:(Ljava/lang/String;)V
  23.    31:  invokestatic    #2//Method get:()I
  24.    34:  istore_1
  25.    35:  iconst_0
  26.    36:  istore_2
  27.    37:  iload_2
  28.    38:  iload_1
  29.    39:  if_icmpge   56
  30.    42:  getstatic   #3//Field java/lang/System.out:Ljava/io/PrintStream;
  31.    45:  ldc #7//String test2
  32.    47:  invokevirtual   #5//Method java/io/PrintStream.println:(Ljava/lang/String;)V
  33.    50:  iinc    21
  34.    53:  goto    37
  35.    56:  return
  36. public static int get();
  37.   Code:
  38.    0:   iconst_5
  39.    1:   ireturn
  40. }
        显然编译器没有预期的对代码进行优化。其实思考一下,这种情况下编译器并不能确定这是一个循环不变运算,因为它不能对方法调用的结果进行假设。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值