blob: b37078eabbccab9104d8823fa93cd1a2c1761453 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
namespace Apache.Ignite.Benchmarks
{
using System;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading;
using Apache.Ignite.Benchmarks.Model;
/// <summary>
/// Utility methods for benchmarks.
/// </summary>
internal static class BenchmarkUtils
{
/** Property binding flags. */
private const BindingFlags PropFlags = BindingFlags.Instance | BindingFlags.Public;
/** Thread-local random. */
private static readonly ThreadLocal<Random> Rand;
/** Cached ANSI characters. */
private static readonly char[] Chars;
/** Seed to randoms. */
private static int _seedCtr;
/// <summary>
/// Static initializer.
/// </summary>
static BenchmarkUtils()
{
Rand = new ThreadLocal<Random>(() =>
{
var seed = Interlocked.Add(ref _seedCtr, 100);
return new Random(seed);
});
Chars = new char[10 + 26 + 26];
var pos = 0;
for (var i = '0'; i < '0' + 10; i++)
Chars[pos++] = i;
for (var i = 'A'; i < 'A' + 26; i++)
Chars[pos++] = i;
for (var i = 'a'; i < 'a' + 26; i++)
Chars[pos++] = i;
}
/// <summary>
/// Generate random integer.
/// </summary>
/// <param name="max">Maximum value (exclusive).</param>
/// <returns></returns>
public static int GetRandomInt(int max)
{
return GetRandomInt(0, max);
}
/// <summary>
/// Generate random integer.
/// </summary>
/// <param name="min">Minimum value (inclusive).</param>
/// <param name="max">Maximum value (exclusive).</param>
/// <returns></returns>
public static int GetRandomInt(int min, int max)
{
return Rand.Value.Next(min, max);
}
/// <summary>
/// Generate random string.
/// </summary>
/// <param name="len">Length.</param>
/// <returns>String.</returns>
public static string GetRandomString(int len)
{
var rand = Rand.Value;
var sb = new StringBuilder();
for (var i = 0; i < len; i++)
sb.Append(Chars[rand.Next(Chars.Length)]);
return sb.ToString();
}
/// <summary>
/// Generate random address.
/// </summary>
/// <returns>Address.</returns>
public static Address GetRandomAddress()
{
return new Address(
GetRandomString(15),
GetRandomString(20),
GetRandomInt(1, 500),
GetRandomInt(1, 35)
);
}
/// <summary>
/// Generate random company.
/// </summary>
/// <returns>Company.</returns>
public static Company GetRandomCompany()
{
return new Company(
GetRandomInt(0, 100),
GetRandomString(20),
GetRandomInt(100, 3000),
GetRandomAddress(),
GetRandomString(20)
);
}
/// <summary>
/// Generate random employee.
/// </summary>
/// <param name="payload">Payload size.</param>
/// <returns>Employee.</returns>
public static Employee GetRandomEmployee(int payload)
{
return new Employee(
GetRandomInt(0, 1000),
GetRandomString(15),
GetRandomInt(0, 1000),
GetRandomInt(18, 60),
(Sex)GetRandomInt(0, 1),
GetRandomInt(10000, 30000),
GetRandomAddress(),
(Department)GetRandomInt(0, 5),
payload
);
}
/// <summary>
/// List all properties present in the given object.
/// </summary>
/// <param name="obj">Object.</param>
/// <returns>Properties.</returns>
public static PropertyInfo[] GetProperties(object obj)
{
return obj.GetType().GetProperties(PropFlags);
}
/// <summary>
/// Find property with the given name in the object.
/// </summary>
/// <param name="obj">Object.</param>
/// <param name="name">Name.</param>
/// <returns>Property.</returns>
public static PropertyInfo GetProperty(object obj, string name)
{
return GetProperties(obj)
.FirstOrDefault(prop => prop.Name.Equals(name, StringComparison.OrdinalIgnoreCase));
}
/// <summary>
/// Set property on the given object.
/// </summary>
/// <param name="obj">Object.</param>
/// <param name="prop">Property.</param>
/// <param name="val">Value.</param>
public static void SetProperty(object obj, PropertyInfo prop, string val)
{
object val0;
var propType = prop.PropertyType;
if (propType == typeof(int))
{
try
{
val0 = int.Parse(val);
}
catch (Exception e)
{
throw new Exception("Failed to parse property value [property=" + prop.Name +
", value=" + val + ']', e);
}
}
else if (propType == typeof(long))
{
try
{
val0 = long.Parse(val);
}
catch (Exception e)
{
throw new Exception("Failed to parse property value [property=" + prop.Name +
", value=" + val + ']', e);
}
}
else if (propType == typeof(bool))
{
try
{
val0 = bool.Parse(val);
}
catch (Exception e)
{
throw new Exception("Failed to parse property value [property=" + prop.Name +
", value=" + val + ']', e);
}
}
else if (propType == typeof(string))
val0 = val;
else
throw new Exception("Unsupported property type [property=" + prop.Name +
", type=" + propType.Name + ']');
prop.SetValue(obj, val0, null);
}
}
}