CSharp · Console
using System;
using System.Linq;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Diagnostics;
public class Program
{
private const int ITEMS_COUNT = 10;
private const int MAX_DEGREE_OF_PARALLELISM = 1;
private static readonly TimeSpan IODuration = TimeSpan.FromMilliseconds(10);
private static IDictionary<string, string> _database = new ConcurrentDictionary<string, string>();
public static void Main()
{
_database = new ConcurrentDictionary<string, string>();
var timer = Stopwatch.StartNew();
Insert();
timer.Stop();
ValidateDatabase(_database);
Console.WriteLine("Sequencial: {0} ms", timer.ElapsedMilliseconds);
_database = new ConcurrentDictionary<string, string>();
timer = Stopwatch.StartNew();
InsertBulkParallel();
timer.Stop();
ValidateDatabase(_database);
Console.WriteLine("Parallel Library: {0} ms", timer.ElapsedMilliseconds);
_database = new ConcurrentDictionary<string, string>();
timer = Stopwatch.StartNew();
InsertBulkAsync();
timer.Stop();
ValidateDatabase(_database);
Console.WriteLine("Async Library: {0} ms", timer.ElapsedMilliseconds);
}
public static void Insert()
{
var list = GenerateItems();
var count = list.Count();
for (var i = 0; i < count; i++)
{
InsertInDatabaseAsync($"{i}", list.ElementAt(i)).GetAwaiter().GetResult();
}
}
public static void InsertBulkParallel()
{
var list = GenerateItems();
var count = list.Count();
var options = new ParallelOptions{MaxDegreeOfParallelism = MAX_DEGREE_OF_PARALLELISM};
Parallel.For(0, count, options, (i) =>
{
InsertInDatabaseAsync($"{i}", list.ElementAt(i)).GetAwaiter().GetResult();
});
}
public static void InsertBulkAsync()
{
var list = GenerateItems();
var count = list.Count();
ForEachAsync(list, (item, index) => InsertInDatabaseAsync($"{index}", item)).GetAwaiter().GetResult();
}
private static async Task InsertInDatabaseAsync(string index, string item)
{
await Task.Delay(IODuration);
_database[index] = item;
}
private static IEnumerable<string> GenerateItems()
{
var list = new List<string>();
for (var i = 0; i < ITEMS_COUNT; i++)
{
list.Add($"{{\"id\":\"{i}\" }}");
}
return list;
}
private static void ValidateDatabase(IDictionary<string, string> dict)
{
if (dict.Count != ITEMS_COUNT)
{
throw new Exception("Items count wrong");
}
for(var i = 0; i < dict.Count; i++)
{
//Console.WriteLine($"dict[{i}] = {dict[i.ToString()]}");
if(!dict.ContainsKey($"{i}"))
{
throw new Exception("Key not found");
}
}
}
private static async Task ForEachAsync<T>(IEnumerable<T> enumerable, Func<T, int, Task> asyncFunc)
{
var itemsCount = enumerable.Count();
var tasks = new Task[itemsCount];
int i = 0;
foreach (var t in enumerable)
{
tasks[i] = asyncFunc(t, i);
i++;
}
await Task.WhenAll(tasks);
}
}