相关疑难解决方法(0)

如何在Java中编写正确的微基准测试?

你如何在Java中编写(并运行)正确的微基准测试?

我在这里寻找代码示例和注释,说明要考虑的各种事项.

示例:基准测量应该测量时间/迭代或迭代/时间,为什么?

相关:秒表基准可以接受吗?

java benchmarking jvm jvm-hotspot microbenchmark

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

Java性能测试

我想在Java应用程序上进行一些计时测试.这就是我目前正在做的事情:

long startTime = System.currentTimeMillis();
doSomething();
long finishTime = System.currentTimeMillis();
System.out.println("That took: " + (finishTime - startTime) + " ms");
Run Code Online (Sandbox Code Playgroud)

像这样的性能测试有什么"错误"吗?什么是更好的方法?

重复:秒表基准可以接受吗?

java performance performance-testing

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

如何在Java中以微秒精度测量时间?

我在互联网上看到我应该使用System.nanoTime(),但这对我不起作用 - 它给了我毫秒精度的时间.我只需要在我的函数执行之前和之后的微秒,这样我就知道需要多长时间.我正在使用Windows XP.

基本上,我有这样的代码,例如,在java链表中进行了100万到1000万次插入.问题是我无法衡量精确度; 有时在较小的列表中插入所有内容所需的时间较少.

这是一个例子:

class test
{
    public static void main(String args[])
    {
        for(int k=1000000; k<=10000000; k+=1000000)
        {
            System.out.println(k);
            LinkedList<Integer> aux = new LinkedList<Integer>();
            //need something here to see the start time
            for(int i=0; i<k; i++)
                aux.addFirst(10000);
            //need something here to see the end time
            //print here the difference between both times
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我这样做了很多次 - 每个k都有一个外部循环做20次 - 但结果并不好.有时需要更少的时间来进行1000万次插入而不是100万次插入,因为我没有使用我现在使用的内容获得正确的测量时间(System.nanoTime())

编辑2:是的,我正在使用Sun JVM.

编辑3:我可能在代码中做错了什么,我会看看改变它是否符合我的要求.

编辑4:我的错误,似乎System.nanoTime()工作.唷.

java time

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

输出时序问题

以下代码:

String str1="asdfavaxzvzxvc";
String str2="werwerzsfaasdf";
Object c=str1;
Object d=str2;
System.out.println(c);
long time1=System.currentTimeMillis();
for(int i=0;i<1000000000;i++){
    if(c.equals(d)){
        //System.out.println("asfasdfasdf"); // line 9
    }
}
long time2=System.currentTimeMillis();
System.out.println("time taken in this is "+(time2-time1));
Run Code Online (Sandbox Code Playgroud)

当我取消对第9行的注释时,如果条件为真则打印,但是由于两个对象不相等都不会发生,所以它需要5000+毫秒,令我惊讶的是只需注释它只需要5毫秒,我没有理由,为什么它需要这么多时间,如果没有评论,因为它永远不会被执行...

这是某种分支预测效果吗?或任何类型的编译器优化

java timing

9
推荐指数
2
解决办法
210
查看次数

分支或乘法更有效吗?

我正在尝试优化一个小的,高度使用的函数,该函数使用无符号short int中的高位来指示要一起求和的数组值.起初我使用下面显示的明显方法.请注意,循环展开未明确显示,因为它应由编译器完成.

int total = 0;
for(unsigned short mask = 0x0001, j = 0; mask != 0; mask <<= 1, j++){
    if (i & mask){
        total += value[j];
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,后来我认为删除分支以帮助CPU流水线操作可能会更好,并提出以下建议.

int total = 0;
for(unsigned short mask = 0x0001, j = 0; mask != 0; mask <<= 1, j++){
    total += ((i & mask) != 0) * value[j];
}
Run Code Online (Sandbox Code Playgroud)

请注意,由于(i&mask)不会产生布尔答案,因此与0的比较会强制结果为1或0.虽然第二种方法从代码的这一部分中删除了if语句,但第二种解决方案需要除了等式的其余部分之外,在每次迭代时运行0或1的乘法.

哪个代码运行得更快?

c c++ optimization branch if-statement

7
推荐指数
3
解决办法
3845
查看次数

Java - 重复的函数调用减少了执行时间

我有以下代码

public class BenchMark {
    public static void main(String args[]) {
        doLinear();

        doLinear();

        doLinear();

        doLinear();

    }


    private static void doParallel() {
        IntStream range = IntStream.range(1, 6).parallel();

        long startTime = System.nanoTime();
        int reduce = range
                .reduce((a, item) -> a * item).getAsInt();
        long endTime = System.nanoTime();
        System.out.println("parallel: " +reduce + " -- Time: " + (endTime - startTime));
    }

    private static void doLinear() {
        IntStream range = IntStream.range(1, 6);

        long startTime = System.nanoTime();
        int reduce = range
                .reduce((a, item) -> a * …
Run Code Online (Sandbox Code Playgroud)

performance jvm java-8 java-stream

7
推荐指数
1
解决办法
1021
查看次数

如何准确测量c ++函数使用的时钟周期?

我知道我必须使用:rdtsc.测量的函数是确定性的,但结果远非可重复(我从运行到运行得到5%的振荡).可能的原因是:

  • 上下文切换
  • 缓存未命中

你知道其他原因吗?如何消除它们?

performance benchmarking

3
推荐指数
1
解决办法
5312
查看次数