Beispiel #1
0
        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
                }
            }
        }
Beispiel #2
0
        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);
            }
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
                        }
                    }
                }
            }
        }