相关疑难解决方法(0)

"x = x ++"之后的x是什么?

执行此操作后会发生什么(窗帘后面)?

int x = 7;
x = x++;
Run Code Online (Sandbox Code Playgroud)

也就是说,当一个变量后期递增并在一个语句中赋值给自己时?我编译并执行了这个.在整个声明之后x仍然是7 .在我的书中,它说增加了!x

java operators post-increment

273
推荐指数
11
解决办法
4万
查看次数

如果y = 1且y = y ++,为什么当我打印y时值为1?

可能重复:
"x = x ++"后的x是什么?

int y = 1;
y = y++;
System.out.println("Value Of y :"+y);
Run Code Online (Sandbox Code Playgroud)

输出值为y:1

我正在递增y并再次将其分配给"y".因此,首先使用该值,然后递增该值.因此它分配值并且它会增加.所以我认为输出将是2.

int y = 1;
int x = y++;
System.out.println("Value Of x :"+x);
System.out.println("Value Of y :"+y);
Run Code Online (Sandbox Code Playgroud)

输出为:
值x:1
值y:2

在这种情况下,它正在工作.我的意思是我认为正确的方式.

任何人都可以向我解释原因吗?

java

37
推荐指数
0
解决办法
4136
查看次数

javac优化标志

我最近在C中编写了很多代码,现在正在转向Java.我目前正在实现一个大型数据结构,并且想知道在调用Java编译器时是否可以打开任何优化标志以提高gcc中的性能.

我习惯了:

gcc -O3 -NDEBUG MyProgram.c
Run Code Online (Sandbox Code Playgroud)

有一个类似的命令javac吗?

我正在使用JDK并且正在运行Ubuntu 10.04.

java compiler-construction optimization javac

31
推荐指数
3
解决办法
3万
查看次数

Java for循环与while循环.性能差异?

假设我有以下代码,有三个for循环来做某事.如果我将最外部的for循环更改为while循环,它会快速运行吗?谢谢~~

int length = 200;
int test = 0;
int[] input = new int[10];

for(int i = 1; i <= length; i++) {
    for (int j = 0; j <=length - i; j++) {
        for (int k = 0; k < length - 1; k++) {
            test = test + input[j + k];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

java for-loop while-loop

29
推荐指数
4
解决办法
8万
查看次数

我应该使用javac -O选项进行优化吗?

javac 一个有趣的-O选择:

通过内联静态,最终和私有方法来优化编译代码.请注意,您的课程可能会变得更大.

这个选项似乎不受欢迎(隐藏?),我今天刚刚在CodeCup 2014页面上发现它.

-O中未提及的官方文件,也不在man javac......奇怪.

在对类似问题的接受答案中,我们可以读到:

Java中的优化主要由JIT编译器在运行时完成.因此,没有必要尝试指示它在编译时优化某种方式(无论如何它只创建字节码).JIT几乎肯定会在现场做出更好的决策,了解确切的环境并观察代码特定部分的实际执行模式.

我的问题是:

我应该总是使用该-O选项吗?换句话说,代码总是运行得更快-O或根本没有差别?

也许班级规模会增加太多,整体表现会下降?或者JVM无论如何都会进行内联,所以最好留下它?

类似的故事gcc -O3国旗.

java compiler-construction optimization javac

28
推荐指数
3
解决办法
3803
查看次数

Java编译器是否优化了不必要的三元运算符?

我一直在审查代码,其中一些编码器一直在使用冗余三元运算符"以提高可读性."例如:

boolean val = (foo == bar && foo1 != bar) ? true : false;
Run Code Online (Sandbox Code Playgroud)

显然,将语句的结果分配给boolean变量会更好,但编译器是否关心?

java code-readability compiler-optimization

25
推荐指数
3
解决办法
1757
查看次数

编译器优化:Java字节码

我目前正在编写一个针对Java字节码的玩具编译器.

我想知道在编写.class文件之前是否存在可以在发出的字节码中进行的各种简单窥孔优化的某种目录,可能是摘要.我实际上知道一些具有此功能的库,但我想自己实现它.

java compiler-construction optimization bytecode

13
推荐指数
1
解决办法
7128
查看次数

为什么java字节码"存储"通常后跟"加载"?

当我从一些小的java函数中读取jvm字节码时,我发现当一个新的局部变量在操作数堆栈上计算时,假设它将存储在局部变量表中,但通常它会立即加载到操作数堆栈中(仅字面上的字节码).我操作不好,是不必要的操作?

java bytecode jvm-bytecode

7
推荐指数
2
解决办法
468
查看次数

为什么Java编译器没有优化一个简单的方法?

我有一个简单的类用于说明目的:

public class Test {

    public int test1() {
        int result = 100;
        result = 200;
        return result;
    }

    public int test2() {
        return 200;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器生成的字节码(检查者javap -c Test.class)如下:

public int test1();
Code:
   0: bipush        100
   2: istore_1
   3: sipush        200
   6: istore_1
   7: iload_1
   8: ireturn

public int test2();
Code:
   0: sipush        200
   3: ireturn
Run Code Online (Sandbox Code Playgroud)

为什么编译器没有将test1方法优化为为该方法生成的相同字节码test2?我希望它至少可以避免result变量的冗余初始化,因为很容易得出结论100根本没有使用该值.

我用Eclipse编译器和javac.

javacversion 1.8.0_72:,与Java一起作为JDK的一部分安装:

Java(TM) SE Runtime Environment (build …
Run Code Online (Sandbox Code Playgroud)

java bytecode javac compiler-optimization

6
推荐指数
2
解决办法
423
查看次数

双倍乘以加速度

背景

我是航空航天工程和EECS学生.我正处于大量数学和物理学的工作,但尚未进入算法或汇编语言.

我设计和编写了各种各样的程序,从商业建议软件到卫星硬件控制器.

这项工作大部分涉及在其他媒介中进行数学运算,然后编写代码来实现它.

在将它们放入代码之前,我代数地简化了这些方程式.但是在我花时间这么做之前,我想知道我是否应该支持更多的加法运算,或者更多的乘法运算.(我已经知道分工的成本要高得多.)


B sub-x prime

这是我从其他一些工作中得出的等式,这是我所看到的非常典型的.

我们可以清楚地看到,至少有一些方法可以简化这个等式.由于简化是我的决定,我想挑选尽可能多的有利于性能的选项实用.我不打算以算法设计时为代价获得前沿性能.


问题

一般来说,哪种双重操作更快:加法或乘法?

我知道知道哪个更快的唯一明确方法是编写和运行基准测试,但这不是重点.对于每次我需要简化方程式时编写测试代码的合理性,这不是一个足够高的优先级.我需要的是一个适用于我的代数的经验法则.

如果差异是如此微小,以至于边界可忽略不计或不确定,这是一个可以接受的答案,只要我知道它几乎没有区别.


支持研究

我知道,在C和C++中,优化器会处理代数,因此它是一个空问题.但是,据我所知,Java编译器不进行代数简化/优化.具体来说,这个答案表明情况就是这样,程序员应该进行这种优化.

互联网上存在分散的答案,但我无法得出确凿的答案.一位前马里兰大学物理系的学生在Java上运行这些测试,但表中没有双重性能数据,图表比例使结果难以辨认.这个魁北克大学CS教授的测试只揭示了整数运算的结果.这个SO答案解释说,在硬件层面上,乘法是一个更复杂的操作,但我也意识到工程师在设计处理器时要记住这些事情.

其他有用的链接:

java algorithm double optimization performance

5
推荐指数
1
解决办法
954
查看次数