【发布时间】:2014-03-03 03:24:14
【问题描述】:
看完问题Why is processing a sorted array faster than an unsorted array? 我们曾尝试将变量设置为 volatile(我预计,当我使用 volatile 时,它的工作速度一定会变慢,但它的工作速度会更快) 这是我没有 volatile 的代码:(它的工作时间约为 11 秒。)
import java.util.Arrays;
import java.util.Random;
public class GGGG {
public static void main(String[] args) {
int arraySize = 32768;
int data[];
data = new int[arraySize];
Random rnd = new Random(0);
for (int c = 0; c < arraySize; ++c) {
data[c] = rnd.nextInt() % 256;
}
Arrays.sort(data);
long start = System.nanoTime();
long sum = 0;
for (int i = 0; i < 200000; ++i) {
for (int c = 0; c < arraySize; ++c) {
if (data[c] >= 128) {
sum += data[c];
}
}
}
System.out.println((System.nanoTime() - start) / 1000000000.0);
System.out.println("sum = " + sum);
System.out.println("=========================");
}
输出是:
10.876173341
sum = 310368400000
=========================
这是当我使用 arraySize 和数据变量作为 volatile 时,它的工作时间约为 7 秒:
import java.util.Arrays;
import java.util.Random;
public class GGGG {
static volatile int arraySize = 32768;
static volatile int data[];
public static void main(String[] args) {
data = new int[arraySize];
Random rnd = new Random(0);
for (int c = 0; c < arraySize; ++c) {
data[c] = rnd.nextInt() % 256;
}
Arrays.sort(data);
long start = System.nanoTime();
long sum = 0;
for (int i = 0; i < 200000; ++i) {
for (int c = 0; c < arraySize; ++c) {
if (data[c] >= 128) {
sum += data[c];
}
}
}
System.out.println((System.nanoTime() - start) / 1000000000.0);
System.out.println("sum = " + sum);
System.out.println("=========================");
}
volatile 的输出是:
6.776267265
sum = 310368400000
=========================
我原本期望 volatile 会减慢这个过程,但它的工作速度更快。发生了什么事?
【问题讨论】:
-
只有
static变量我得到4.5 作为输出时间,static volatile我得到11.7。此外,如果我将变量设置为既不是static也不是volatile而是将它们放入方法中,它是 4.6 -
您将变量声明为
static字段,并声明为方法main的局部变量。将大数组声明为方法的局部变量可能意味着开销,这可以解释为什么 volatile 在您的情况下会更快。两次都与静态变量进行比较。 -
我刚刚用静态(没有易失性)检查了它,它给了我 8 秒。而且,当我在方法内部或外部声明(即使是静态的)时有什么区别 - 我所做的只是计算逻辑的时间:)
标签: java performance microbenchmark