我有一个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);
当然,在大投入上这是一个大问题,那么这里错了吗?
答案 0 :(得分:3)
之所以发生这种情况,是因为在首次调用Lambda时,JVM会动态生成一个新类。之后,可以重用该类。这就是为什么您第一次出现高延迟的原因。
此外,重要的是要了解Lambda并非总是最好的选择,特别是对于可以使用旧循环执行的简单操作而言。 This article内容丰富,对于那些对Stream性能感兴趣的人来说是一本不错的书。