enum.ToString стоит 2микросекунды, как Datetime.ToString !
От: mihhon  
Дата: 27.09.11 10:10
Оценка:
что за тормоза ?? или я что-то не понимаю ???

out — switch в 500 раз быстрее:
10000000 ToString took 17714ms, 0.0017714ms for one
10000000 custom took 37ms, 3.7E-06ms for one

namespace Test
{
    using System;
    using System.Diagnostics;

    public class ToStringEnumPerfTest
    {
        public static void Main(string[] args)
        {
            const int load = 10000000;


            var e = Enumm.e5;

            var stopwatch = new Stopwatch();
            stopwatch.Start();

            for (int i = 0; i < load; i++)
            {
                var str = e.ToString();
            }

            stopwatch.Stop();
            Console.WriteLine(string.Format("{0} ToString took {1}ms, {2}ms for one", load, stopwatch.ElapsedMilliseconds, 1.0 * stopwatch.ElapsedMilliseconds / load));


            stopwatch = new Stopwatch();
            stopwatch.Start();

            for (int i = 0; i < load; i++)
            {
                var str = ToString(e);
            }

            stopwatch.Stop();
            Console.WriteLine(string.Format("{0} custom took {1}ms, {2}ms for one", load, stopwatch.ElapsedMilliseconds, 1.0 * stopwatch.ElapsedMilliseconds / load));

        }

        public static string ToString(Enumm e)
        {
            switch (e)
            {
                case Enumm.e1:
                    return "e1";
                case Enumm.e2:
                    return "e2";
                case Enumm.e3:
                    return "e3";
                case Enumm.e4:
                    return "e4";
                case Enumm.e5:
                    return "e5";
                case Enumm.e6:
                    return "e6";
                case Enumm.e7:
                    return "e7";
                default:
                    return e.ToString();
            }
        }

        public enum Enumm
        {
            e1,
            e2,
            e3,
            e4,
            e5,
            e6,
            e7
        }
    }
}
Re: enum.ToString стоит 2микросекунды, как Datetime.ToString
От: Lloyd Россия  
Дата: 27.09.11 10:12
Оценка:
Здравствуйте, mihhon, Вы писали:

M>что за тормоза ?? или я что-то не понимаю ???


M>out — switch в 500 раз быстрее:

В вашей реализации не учитывается, что enum может быть Flags
Re[2]: enum.ToString стоит 2микросекунды, как Datetime.ToStr
От: mihhon  
Дата: 27.09.11 10:18
Оценка:
M>>out — switch в 500 раз быстрее:
L>В вашей реализации не учитывается, что enum может быть Flags

так ? те же тормоза

10000000 ToString took 17434ms, 0.0017434ms for one
10000000 custom took 38ms, 3.8E-06ms for one



namespace Test
{
    using System;
    using System.Diagnostics;

    public class ToStringEnumPerfTest
    {
        public static void Main(string[] args)
        {
            const int load = 10000000;


            var e = Enumm.flugz;

            var stopwatch = new Stopwatch();
            stopwatch.Start();

            for (int i = 0; i < load; i++)
            {
                var str = e.ToString();
            }

            stopwatch.Stop();
            Console.WriteLine(string.Format("{0} ToString took {1}ms, {2}ms for one", load, stopwatch.ElapsedMilliseconds, 1.0 * stopwatch.ElapsedMilliseconds / load));


            stopwatch = new Stopwatch();
            stopwatch.Start();

            for (int i = 0; i < load; i++)
            {
                var str = ToString(e);
            }

            stopwatch.Stop();
            Console.WriteLine(string.Format("{0} custom took {1}ms, {2}ms for one", load, stopwatch.ElapsedMilliseconds, 1.0 * stopwatch.ElapsedMilliseconds / load));

        }

        public static string ToString(Enumm e)
        {
            switch (e)
            {
                case Enumm.e1:
                    return "e1";
                case Enumm.e2:
                    return "e2";
                case Enumm.e3:
                    return "e3";
                case Enumm.e4:
                    return "e4";
                case Enumm.e5:
                    return "e5";
                case Enumm.e6:
                    return "e6";
                case Enumm.e7:
                    return "e7";
                default:
                    if (e == Enumm.flugz) return "flugs";
                    return e.ToString();
            }
        }

        public enum Enumm
        {
            e1,
            e2,
            e3,
            e4,
            e5,
            e6,
            e7,
            flugz = e1|e2
        }
    }
}
Re[2]: enum.ToString стоит 2микросекунды, как Datetime.ToStr
От: hardcase Пират http://nemerle.org
Дата: 27.09.11 10:18
Оценка:
Здравствуйте, Lloyd, Вы писали:

M>>out — switch в 500 раз быстрее:

L>В вашей реализации не учитывается, что enum может быть Flags

При чем тут это? Является enum-флагом или нет вполне можно определить в статике. Просто кому-то в микрософте было лень оптимизировать ToString у перечислений.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: enum.ToString стоит 2микросекунды, как Datetime.ToStr
От: Lloyd Россия  
Дата: 27.09.11 10:29
Оценка:
Здравствуйте, hardcase, Вы писали:

M>>>out — switch в 500 раз быстрее:

L>>В вашей реализации не учитывается, что enum может быть Flags

H>При чем тут это?


При том, что код не является эквивалетным. А производительость неэквивалентного кода глупо сравнивать.

H>Является enum-флагом или нет вполне можно определить в статике. Просто кому-то в микрософте было лень оптимизировать ToString у перечислений.


Тем не менее, в статике он не определяется.
Re[2]: enum.ToString стоит 2микросекунды, как Datetime.ToStr
От: mihhon  
Дата: 27.09.11 10:44
Оценка: +1
M>>out — switch в 500 раз быстрее:
L>В вашей реализации не учитывается, что enum может быть Flags

учитывается, в куске default: для него вызывается медленный ToString, а всё остальное делается быстро
Re[4]: enum.ToString стоит 2микросекунды, как Datetime.ToStr
От: mihhon  
Дата: 27.09.11 10:57
Оценка:
M>>>>out — switch в 500 раз быстрее:
L>>>В вашей реализации не учитывается, что enum может быть Flags

H>>При чем тут это?


L>При том, что код не является эквивалетным. А производительость неэквивалентного кода глупо сравнивать.


http://www.dotnetperls.com/enum-flags — такое использование enum подразумевает высокое владение техникой "спагетти-код"

для посредственного кодера, который по-старинке использует enum для оптимизации switch/case и т.п. , могли бы и оптимизировать статику
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.