我正在努力对HashMap
上的插入和阅读时间进行一些性能测试,只是为了看看与其他数据结构相比HashMap
性能的变化情况。
我有一个文本文件,其中包含100万个英文单词,其频率为此格式 -
hello 100
world 5000
good 2000
bad 9000
...
现在我逐行读取此文件并将其存储在HashMap
中,以便我可以使用以下代码测量插入性能。
Map<String, String> wordTest = new HashMap<String, String>();
try {
fis = new FileInputStream(FILE_LOCATION);
reader = new BufferedReader(new InputStreamReader(fis));
long startTime = System.nanoTime();
String line = reader.readLine();
while (line != null) {
// split the string on whitespace
String[] splitString = line.split("\\s+");
// now put it in HashMap as key value pair
wordTest.put(splitString[0].toLowerCase().trim(), splitString[1].trim());
line = reader.readLine();
}
long endTime = System.nanoTime() - startTime;
System.out.println("Insertion Time: " +TimeUnit.MILLISECONDS.convert(endTime, TimeUnit.NANOSECONDS));
}
现在我还要在HashMap
中测量读取性能。我知道如何从HashMap获取值但不确定读取时间是什么意思?这意味着从HashMap中搜索一个字符串需要多长时间?
基本上我看了这个链接后感到困惑 - https://github.com/jpountz/tries/wiki/Benchmark。在这个链接中他们有ReadTime
但不确定它是什么意思?
所以我的问题是我的问题,如果我需要计算ReadTime
一般意味着什么?我应该对单个字符串查找从HashMap
或其他内容中获取的时间进行基准测试吗?
或者一般来说,如果我想从HashMap测量ReadTime,我应该怎么做?
答案 0 :(得分:0)
注意:我从不建议您为基准测试提供完美的结果。
它只是一个示例代码,用于在HashMap
中读写随机值。
String atoz = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ0123456789";
Map<String, String> wordTest = new HashMap<String, String>();
//write logic
long startTime = System.currentTimeMillis();
for (int i = 0; i < 24223400; i++) {
int begin1 = 1 + (int) (Math.random() * ((atoz.length() - 1) + 1));
int end1 = begin1 + (int) (Math.random() * ((atoz.length() - begin1) + 1));
int begin2 = 1 + (int) (Math.random() * ((atoz.length() - 1) + 1));
int end2 = begin2 + (int) (Math.random() * ((atoz.length() - begin2) + 1));
wordTest.put(atoz.substring(begin1, end1), atoz.substring(begin2, end2));
}
long endTime = System.currentTimeMillis();
System.out.println("Time taken:" + (endTime - startTime) + " ms to insert "
+ wordTest.size() + " records.");
// Read logic
String atoz1 = "ABCDEFGHIJKLMNOPQURSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
int counter=0;
long startTime1 = System.currentTimeMillis();
for (int i = 0; i < 24223400; i++) {
int begin1 = 1 + (int) (Math.random() * ((atoz1.length() - 1) + 1));
int end1 = begin1 + (int) (Math.random() * ((atoz1.length() - begin1) + 1));
if(wordTest.get(atoz1.substring(begin1, end1))==null){
counter++;
}
}
long endTime1 = System.currentTimeMillis();
System.out.println("Time taken:" + (endTime1 - startTime1) + " ms to read " + 24223400
+ " records." + " Success hit:"+counter);
输出:
Time taken:4440 ms to insert 1953 records.
Time taken:2839 ms to read 24223400 records. Success hit:8743257
注意:所有关键排列都是在1953年的记录之后完成的,所以请尝试使用其他随机字符串和逻辑。