public ParseBenchmarks() { var enumTypes = typeof(string).GetTypeInfo().Assembly.GetTypes().Where(type => type.GetTypeInfo().IsEnum&& !type.GetTypeInfo().IsGenericType).ToList(); _enumDatas = new EnumData[enumTypes.Count]; for (var i = 0; i < _enumDatas.Length; ++i) { var enumType = enumTypes[i]; var names = Enum.GetNames(enumType); var numericValues = new string[names.Length]; var values = Enum.GetValues(enumType); for (var j = 0; j < values.Length; ++j) { numericValues[j] = Enum.Format(enumType, values.GetValue(j), "D"); } var parser = (Parser)Activator.CreateInstance(typeof(Parser <>).MakeGenericType(enumType)); _enumDatas[i] = new EnumData { Type = enumType, Names = names, NumericValues = numericValues, GenericParser = parser }; if (names.Length > 0) { NonGenericEnums.Parse(enumType, names[0]); // Warmup parser.Parse(names[0]); // Warmup } } }
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { try { switch (reader.TokenType) { case JsonToken.Null: if (!TypeData.Get(objectType).IsNullable) { throw new JsonSerializationException($"Cannot convert null value to {objectType}."); } return(null); case JsonToken.String: return(NonGenericEnums.Parse(objectType, (string)reader.Value, EnumFormat)); case JsonToken.Integer: return(NonGenericEnums.ToObject(objectType, reader.Value)); default: throw new JsonSerializationException($"Unexpected token {reader.TokenType} when parsing enum."); } } catch (Exception ex) { throw new JsonSerializationException($"Error converting value {reader.Value} to type '{objectType}'", ex); } }
public object NonGenericEnums_Parse_Decimals() { object result = null; foreach (var enumData in _enumDatas) { var enumType = enumData.Type; foreach (var value in enumData.NumericValues) { result = NonGenericEnums.Parse(enumType, value); } } return(result); }
public static void Parse(IEnumerable <Type> enumTypes) { var list = new List <EnumInfo>(); foreach (var enumType in enumTypes) { var names = Enum.GetNames(enumType).ToList(); var numericValues = new List <string>(names.Count); foreach (var value in Enum.GetValues(enumType)) { numericValues.Add(Enum.Format(enumType, value, "D")); } var parser = (Parser)Activator.CreateInstance(typeof(Parser <>).MakeGenericType(enumType)); list.Add(new EnumInfo { Type = enumType, Names = names, NumericValues = numericValues, GenericParser = parser }); } const int parseIterations = 375; using (new OperationTimer("Enum.Parse (Names)")) { foreach (var tuple in list) { var enumType = tuple.Type; for (var i = 0; i < parseIterations; ++i) { foreach (var name in tuple.Names) { Enum.Parse(enumType, name); } } } } // Primes the pump foreach (var tuple in list) { if (tuple.Names.Count > 0) { NonGenericEnums.Parse(tuple.Type, tuple.Names[0]); } } using (new OperationTimer("NonGenericEnums.Parse (Names)")) { foreach (var tuple in list) { var enumType = tuple.Type; for (var i = 0; i < parseIterations; ++i) { foreach (var name in tuple.Names) { NonGenericEnums.Parse(enumType, name); } } } } // Primes the pump foreach (var tuple in list) { if (tuple.Names.Count > 0) { tuple.GenericParser.Parse(tuple.Names[0]); } } using (new OperationTimer("UnsafeEnums.Parse (Names)")) { foreach (var tuple in list) { var parser = tuple.GenericParser; for (var i = 0; i < parseIterations; ++i) { foreach (var name in tuple.Names) { parser.Parse(name); } } } } using (new OperationTimer("Enum.Parse (Decimal)")) { foreach (var tuple in list) { var enumType = tuple.Type; for (var i = 0; i < parseIterations; ++i) { foreach (var numericValue in tuple.NumericValues) { Enum.Parse(enumType, numericValue); } } } } using (new OperationTimer("NonGenericEnums.Parse (Decimal)")) { foreach (var tuple in list) { var enumType = tuple.Type; for (var i = 0; i < parseIterations; ++i) { foreach (var numericValue in tuple.NumericValues) { NonGenericEnums.Parse(enumType, numericValue); } } } } using (new OperationTimer("UnsafeEnums.Parse (Decimal)")) { foreach (var tuple in list) { var parser = tuple.GenericParser; for (var i = 0; i < parseIterations; ++i) { foreach (var numericValue in tuple.NumericValues) { parser.Parse(numericValue); } } } } }