Java 8流,仅首次获得max()会花费很长时间

时间:2019-03-10 00:43:32

标签: java arrays java-stream

我有一个import tensorflow as tf mnist = tf.keras.datasets.mnist (x_train, y_train),(x_test, y_test) = mnist.load_data() x_train = tf.keras.utils.normalize(x_train, axis=1) x_test = tf.keras.utils.normalize(x_test, axis=1) model = tf.keras.models.Sequential() model.add(tf.keras.layers.Flatten()) model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu)) model.add(tf.keras.layers.Dense(128, activation=tf.nn.relu)) model.add(tf.keras.layers.Dense(10, activation=tf.nn.softmax)) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=3) val_loss, val_acc = model.evaluate(x_test, y_test) print(val_loss) print(val_acc) ,它以HashMap作为 Key ,以整数数组作为 value Integer。 / p>

因此,我每次循环到另一个数组时都试图获取最大值(数组大小),例如:

HashMap<Integer, Integer[]>()

在不同的输入上多次运行此程序后,我总是第一次遇到高延迟,例如:

long startTime = System.currentTimeMillis();

result[i] = map.entrySet().stream().mapToInt(element -> element.getValue().size()).max().getAsInt() + 1;

long endTime   = System.currentTimeMillis();

long totalTime = endTime - startTime;

System.out.println( totalTime);

使用循环

29 // <- First time
0
0
0
0
0

输出:

long startTime = System.currentTimeMillis();

for (Map.Entry<Integer, List<Integer>> element: map.entrySet()) {
     result[i] = result[i] < element.getValue().size() ? element.getValue().size() : result[i];
}


long endTime = System.currentTimeMillis();

long totalTime = endTime - startTime;

System.out.println( "  " + totalTime);

当然,在大投入上这是一个大问题,那么这里错了吗?

1 个答案:

答案 0 :(得分:3)

之所以发生这种情况,是因为在首次调用Lambda时,JVM会动态生成一个新类。之后,可以重用该类。这就是为什么您第一次出现高延迟的原因。

此外,重要的是要了解Lambda并非总是最好的选择,特别是对于可以使用旧循环执行的简单操作而言。 This article内容丰富,对于那些对Stream性能感兴趣的人来说是一本不错的书。