-
Notifications
You must be signed in to change notification settings - Fork 5.2k
Closed
Labels
Milestone
Description
Description
10 times faster on 1000 elements.
5 times faster on 1000000 elements.
Configuration
.NET Core 3.1 on release
Java 12 on nodebug
Java
public static void main(String[] args) {
Random random = random = new Random();
while (true) {
int count = 1000000;
int times = 10;
int existsStart = random.nextInt(count);
int notExistsStart = existsStart + count;
String[] exists = getStrings(existsStart, existsStart + count);
String[] notExists = getStrings(notExistsStart, notExistsStart + count);
HashMap<String, String> map = new HashMap();
long begin = System.currentTimeMillis();
for (int i = 0; i < exists.length; i++) {
String item = exists[i];
map.put(item, item);
}
System.out.println("add:" + (System.currentTimeMillis() - begin));
begin = System.currentTimeMillis();
for (int t = 0; t < times; t++){
for (int i = 0; i < exists.length; i++) {
String item = exists[i];
map.containsKey(item);
}
}
System.out.println("exists:" + (System.currentTimeMillis() - begin));
begin = System.currentTimeMillis();
for (int t = 0; t < times; t++){
for (int i = 0; i < notExists.length; i++) {
String item = notExists[i];
map.containsKey(item);
}
}
System.out.println("not exists:" + (System.currentTimeMillis() - begin));
begin = System.currentTimeMillis();
for (int i = 0; i < exists.length; i++) {
String item = exists[i];
map.remove(item);
}
System.out.println("remove:" + (System.currentTimeMillis() - begin));
System.out.println("=====================end======================");
}
}
public static String[] getStrings(int start, int end) {
int length = end - start;
String[] ret = new String[length];
for (int i = 0; i < length; i++) {
ret[i] = "0x" + Integer.toString(start + i, 16);
}
return ret;
}
C#
var random = new Random();
while (true)
{
int count = 1000000;
int times = 10;
var existsStart = random.Next(count);
var notExistsStart = existsStart + count;
var exists = Enumerable.Range(existsStart, existsStart + count).Select(i => $"0x{Convert.ToString(i, 16)}").ToArray();
var notExists = Enumerable.Range(notExistsStart, notExistsStart + count).Select(i => $"0x{Convert.ToString(i, 16)}").ToArray();
var dic = new Dictionary<string, object>();
var stopwatch = Stopwatch.StartNew();
for (int i = 0; i < exists.Length; i++)
{
var item = exists[i];
dic.Add(item, item);
}
Console.WriteLine("add:" + stopwatch.ElapsedMilliseconds);
stopwatch = Stopwatch.StartNew();
for (int t = 0; t < times; t++)
{
for (int i = 0; i < exists.Length; i++)
{
var item = exists[i];
dic.ContainsKey(item);
}
}
Console.WriteLine("exists:" + stopwatch.ElapsedMilliseconds);
stopwatch = Stopwatch.StartNew();
for (int t = 0; t < times; t++)
{
for (int i = 0; i < notExists.Length; i++)
{
var item = notExists[i];
dic.ContainsKey(item);
}
}
Console.WriteLine("not exists:" + stopwatch.ElapsedMilliseconds);
stopwatch = Stopwatch.StartNew();
for (int i = 0; i < exists.Length; i++)
{
var item = exists[i];
dic.Remove(item);
}
Console.WriteLine("remove:" + stopwatch.ElapsedMilliseconds);
Console.WriteLine("=====================end======================");
}
Analysis
Is it possible that Java use more extreme tiered compilation optimization?