Продолжаем
собирать граблиАвтор: 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);
}
|
| |
Здравствуйте, Sinix, Вы писали:
Боксинг?
Если да, то правится стандартно:
public static int DoCore<TSomeInterface>(this TSomeInterface x, int i) where TSomeInterface: ISomeInterface => x.Do(i);
ЗЫ
Вообще ИМХО, что нить подобное джит мог бы и сам делать.
Здравствуйте, Jack128, Вы писали:
J>Если да, то правится стандартно:
Ну вот опять на корню интригу убили
Лаадн, в следующий раз позабористей найду.
Здравствуйте, 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).
Здравствуйте, 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 с заданной структурой", и, соответственно, использование $"" в любом инфраструктурном коде. Схожий тикет
есть, но там по-моему чересчур обобщают задачу.
Есть шанс, или всё, поезд ушёл?
Здравствуйте, Sinix, Вы писали:
S>Подскажи плиз, насколько реально продавить просьбу поменять текущее поведение interpolated strings?
S>Есть шанс, или всё, поезд ушёл?
К сожалению, я сейчас недостаточно в курсе дел с дизайном C#, и не располагаю такой информацией.