Минутка WTF-4: дорасширялись
От: Sinix  
Дата: 20.04.16 07:28
Оценка: 4 (2)
Продолжаем собирать грабли
Автор: Sinix
Дата: 02.04.16
.

Что не так с методом DoCore():
        public interface ISomeInterface
        {
            int Do(int i);
        }

        // ...

        public struct SomeStruct : ISomeInterface
        {
            public int Do(int i) => i + 1;
        }
        public struct SomeStruct2 : ISomeInterface
        {
            public int Do(int i) => i - 1;
        }

        // ...

        public static int DoCore(this ISomeInterface x, int i) => x.Do(i);


и как его исправить?

  Подсказка
        public interface ISomeInterface
        {
            int Do(int i);
        }

        // ...

        public struct SomeStruct : ISomeInterface
        {
            public int Do(int i) => i + 1;
        }
        public struct SomeStruct2 : ISomeInterface
        {
            public int Do(int i) => i - 1;
        }

        // ...

        private static int DoCore(this ISomeInterface x, int i) => x.Do(i);

        public static void Main(string[] args)
        {
            Console.WindowWidth = 120;

            const int Count = 100 * 1000 * 1000;
            SomeStruct s = new SomeStruct();

            Measure("DirectCall", () =>
            {
                for (int i = 0; i < Count; i++)
                {
                    s.Do(i);
                }
                return Count;
            });

            Measure("ExtensionMethod", () =>
            {
                for (int i = 0; i < Count; i++)
                {
                    s.DoCore(i);
                }
                return Count;
            });

            Console.WriteLine();
            Console.WriteLine("Done.");
            Console.ReadKey();
        }

        private static void Measure(string name, Func<long> callback)
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();

            var mem = GC.GetTotalMemory(true);
            var gc00 = GC.CollectionCount(0);
            var gc01 = GC.CollectionCount(1);
            var gc02 = GC.CollectionCount(2);

            var sw = Stopwatch.StartNew();
            var result = callback();
            sw.Stop();

            var mem2 = GC.GetTotalMemory(false);
            var gc10 = GC.CollectionCount(0);
            var gc11 = GC.CollectionCount(1);
            var gc12 = GC.CollectionCount(2);

            var memDelta = (mem2 - mem) / 1024.0;
            var gcDelta0 = gc10 - gc00;
            var gcDelta1 = gc11 - gc01;
            var gcDelta2 = gc12 - gc02;

            Console.WriteLine(
                "{0,20}: {1,5}ms, ips: {2,22:N} | Mem: {3,9:N2} kb, GC 0/1/2: {4}/{5}/{6} => {7,6}",
                name, sw.ElapsedMilliseconds, result / sw.Elapsed.TotalSeconds, memDelta, gcDelta0, gcDelta1, gcDelta2, result);
        }
Отредактировано 07.01.2017 16:47 Sinix . Предыдущая версия .
минутка wtf
Re: Минутка WTF-4: дорасширялись
От: Jack128  
Дата: 20.04.16 07:42
Оценка: 73 (2) +1
Здравствуйте, Sinix, Вы писали:

Боксинг?

Если да, то правится стандартно:
public static int DoCore<TSomeInterface>(this TSomeInterface x, int i) where TSomeInterface: ISomeInterface => x.Do(i);


ЗЫ
Вообще ИМХО, что нить подобное джит мог бы и сам делать.
Re[2]: Минутка WTF-4: дорасширялись
От: Sinix  
Дата: 20.04.16 07:49
Оценка:
Здравствуйте, Jack128, Вы писали:

J>Если да, то правится стандартно:

Ну вот опять на корню интригу убили

Лаадн, в следующий раз позабористей найду.
Re[2]: Минутка WTF-4: дорасширялись
От: nikov США http://www.linkedin.com/in/nikov
Дата: 20.04.16 19:00
Оценка: +1
Здравствуйте, Jack128, Вы писали:

J>
J>public static int DoCore<TSomeInterface>(this TSomeInterface x, int i) where TSomeInterface: ISomeInterface => x.Do(i);
J>


Кстати, если структура mutable и метод DoCore пытается вызывать её mutating метод, то изменения будут потеряны и в первом, и в этом варианте. Чтобы их сохранить, параметр нужно сделать ref, но тогда его не сделаешь this (если это C#, а не VB).
Re[3]: Минутка WTF-4: дорасширялись
От: Sinix  
Дата: 20.04.16 19:24
Оценка:
Здравствуйте, nikov, Вы писали:

N>Кстати, если структура mutable и метод DoCore пытается вызывать её mutating метод, то изменения будут потеряны и в первом, и в этом варианте. Чтобы их сохранить, параметр нужно сделать ref, но тогда его не сделаешь this (если это C#, а не VB).


Ага Знал, но явно написать не сообразил. Тут первопричину лечить нужно: тот, кто использует изменяемые структуры в public API — ССЗБ по определению.


Оффтоп:

Подскажи плиз, насколько реально продавить просьбу поменять текущее поведение interpolated strings?
Конкретно — речь про вот этот топик
Автор: Sinix
Дата: 19.04.16
, а если совсем-совсем конкретно, то про решения из вот этого обсуждения (со ссылке речь про VB, но аналогичной заметки для шарпа вроде бы нет).

Какие основные сценарии текущий дизайн не покрывает:

1. Игнорирование перегрузок с FormattableString. Убивает перфоманс для conditional format-методов. Всякие логгеры, ассерты, ресурсы и т.д. и т.п. Или использовать грязный хак + красивейшее решение
Автор: Sinclair
Дата: 20.04.16
от Sinclair к нему, или страдать

2. Extension methods для FormattableString. Чтобы использовать — только явный каст. Убивает сценарий "красиво форматировать interpolated string с заданной структурой", и, соответственно, использование $"" в любом инфраструктурном коде. Схожий тикет есть, но там по-моему чересчур обобщают задачу.


Есть шанс, или всё, поезд ушёл?
Re[4]: Минутка WTF-4: дорасширялись
От: nikov США http://www.linkedin.com/in/nikov
Дата: 20.04.16 22:47
Оценка: 46 (1)
Здравствуйте, Sinix, Вы писали:

S>Подскажи плиз, насколько реально продавить просьбу поменять текущее поведение interpolated strings?

S>Есть шанс, или всё, поезд ушёл?

К сожалению, я сейчас недостаточно в курсе дел с дизайном C#, и не располагаю такой информацией.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.