相关疑难解决方法(0)

为什么if(variable1%variable2 == 0)效率低下?

我是java的新手,并且昨晚运行了一些代码,这真让我烦恼.我正在构建一个简单的程序来显示for循环中的每个X输出,当我使用模数作为variable % variablevs variable % 5000或诸如此类时,我注意到性能的大幅下降.有人可以向我解释为什么会这样,是什么导致它?所以我可以更好......

这是"高效"代码(对不起,如果我得到一些语法错误我现在不在计算机上的代码)

long startNum = 0;
long stopNum = 1000000000L;

for (long i = startNum; i <= stopNum; i++){
    if (i % 50000 == 0) {
        System.out.println(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

这是"效率低下的代码"

long startNum = 0;
long stopNum = 1000000000L;
long progressCheck = 50000;

for (long i = startNum; i <= stopNum; i++){
    if (i % progressCheck == 0) {
        System.out.println(i);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我有一个日期变量来衡量差异,一旦它变得足够长,第一个花了50毫秒而另一个花了12秒或类似的东西.如果你的电脑比我的电脑更有效,你可能不得不增加stopNum或减少progressCheck.

我在网上找了这个问题,但我找不到答案,也许我只是没有问它.

编辑:我没想到我的问题如此受欢迎,我很欣赏所有答案.我确实在每一半的时间内执行了一个基准测试,效率低下的代码需要相当长的时间,1/4秒与10秒的时间相比.当然他们正在使用println,但他们都做了相同的数量,所以我不认为这会扭曲很多,特别是因为差异是可重复的.至于答案,因为我是Java新手,我会让投票现在决定哪个答案最好.我会在星期三之前选择一个.

EDIT2:我今晚要进行另一次测试,而不是模数,它只是递增一个变量,当它达到progressCheck时,它将执行一次,然后将该变量重置为0.对于第三个选项.

EDIT3.5:

我使用了这段代码,下面我将展示我的结果..谢谢大家的精彩帮助!我也尝试将long的短值与0进行比较,因此我所有的新检查都会发生"65536"次,使其在重复中相等.

public …
Run Code Online (Sandbox Code Playgroud)

java performance

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

为什么在没有垃圾收集开销的情况下这个测试需要更长的时间?

我在开发用于异步消息传递的轻量级库的过程中遇到了这种情况。为了了解创建大量寿命较短的中等大小对象的成本,我编写了以下测试:

\n
import java.nio.ByteBuffer;\nimport java.util.Random;\n\n\npublic class MemPressureTest {\n    static final int SIZE = 4096;\n    static final class Bigish {\n        final ByteBuffer b;\n\n\n        public Bigish() {\n            this(ByteBuffer.allocate(SIZE));\n        }\n\n        public Bigish(ByteBuffer b) {\n            this.b = b;\n        }\n\n        public void fill(byte bt) {\n            b.clear();\n            for (int i = 0; i < SIZE; ++i) {\n                b.put(bt);\n            }\n        }\n    }\n\n\n    public static void main(String[] args) {\n        Random random = new Random(1);\n        Bigish tmp = new Bigish();\n        for (int i = 0; i < 3e7; ++i) …
Run Code Online (Sandbox Code Playgroud)

java performance garbage-collection jvm garbage

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

Java方法调用性能

我有这段代码做范围最小查询.当t = 100000时,i和j总是在每个输入行中改变,它在Java 8u60中的执行时间约为12秒.

for (int a0 = 0; a0 < t; a0++) {
    String line = reader.readLine();
    String[] ls = line.split(" ");
    int i = Integer.parseInt(ls[0]);
    int j = Integer.parseInt(ls[1]);
    int min = width[i];
    for (int k = i + 1; k <= j; k++) {
        if (min > width[k]) {
            min = width[k];
        }
    }
    writer.write(min + "");
    writer.newLine();
}
Run Code Online (Sandbox Code Playgroud)

当我提取新方法以找到最小值时,执行时间快4倍(约2.5秒).

    for (int a0 = 0; a0 < t; a0++) {
        String line = reader.readLine();
        String[] …
Run Code Online (Sandbox Code Playgroud)

java performance

11
推荐指数
1
解决办法
1291
查看次数

Code becomes 6 times slower after doing extract method refactoring

I know micro-benchmarking is hard. I'm not trying to build a poor micro-benchmark. Rather, I have run into this problem when making (what I thought to be) harmless refactoring. There is stripped down demo of the problem below.

The program builds an ArrayList of ten thousand random integers and then finds sum of the elements. In the example, summing is repeated a million times to improve signal v. noise ratio in the measurement of elapsed time. In real program, there's …

java performance refactoring java-stream java-11

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

Java for循环优化

我用java for循环进行了一些运行时测试,并发现了一个奇怪的行为.对于我的代码,我需要原始类型的包装器对象,如int,double等,以模拟io和输出参数,但这不是重点.只需看我的代码.具有字段访问权限的对象如何比原始类型更快?

for 具有prtimitive类型的循环:

public static void main(String[] args) {
    double max = 1000;
    for (int j = 1; j < 8; j++) {
        double i;
        max = max * 10;
        long start = System.nanoTime();
        for (i = 0; i < max; i++) {
        }
        long end = System.nanoTime();
        long microseconds = (end - start) / 1000;
        System.out.println("MicroTime primitive(max: ="+max + "): " + microseconds);
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

MicroTime原语(max:= 10000.0):110
MicroTime原语(max:= 100000.0):1081
MicroTime原语(max:=
1000000.0 ):2450 MicroTime原语(max:= 1.0E7):28248
MicroTime原语(max:= 1.0E8) :276205 …

java optimization jvm for-loop javacompiler

4
推荐指数
1
解决办法
1228
查看次数