我要求从属性文件读取数据,该文件是命令分隔的,显然是字符串形式。所以在那之后我将它分成字符串数组。
我要求将该字符串数组转换为整数列表。
我尝试了两种方法:
然后我想我必须根据表现计算一个好的时间。所以我有一些粗略的数据。
代码:
public class PropertyLoadCSV {
private static Properties properties;
public static void main(String[] args) {
try {
properties = new Properties();
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("resources/csvfile.properties"));
String ids = properties.getProperty("ids");
String[] splitedIDs = ids.split(",");
long startTime = System.nanoTime();
convertUsingJava7(splitedIDs);
long endTime = System.nanoTime();
long duration = (endTime - startTime);
System.out.println(duration);
long startTime1 = System.nanoTime();
convertUsingJava8(splitedIDs);
long endTime1 = System.nanoTime();
long duration1 = (endTime1 - startTime1);
System.out.println(duration1);
} catch (Exception e) {
e.printStackTrace();
}
}
static List<Integer> convertUsingJava7(String[] splited){
List<Integer> list = new ArrayList<>();
for(String s: splited){
list.add(Integer.valueOf(s));
}
return list;
}
static List<Integer> convertUsingJava8(String[] splited){
return Stream.of(splited).map(Integer::parseInt).collect(Collectors.toList());
}
}
在控制台中得到了一些意想不到的结果:
131601
254094088
所以真的java 8流转换并慢慢转换然后传统方式?
我必须将哪一个用作效果关注?
Here's工作示例。
答案 0 :(得分:4)
你正在测量这里的冷启动,这是一个单一的方法调用,没有给JIT任何机会为你做好事。
由于invokedynamic引导,lambda表达式的第一次调用总是很慢(它必须创建实例,实际方法将被调用,但这只是一个惩罚,你必须只支付一次)。
使用像 jmh 这样的工具来正确测量结果,无论哪种方式,你的标准代码都会比溪流更快,这是正常的,你必须为流的基础设施付出代价创建