Вопрос по – Производительность метода расширения

8
            /*I have defined Extension Methods for the TypeX like this*/ 
        public static Int32 GetValueAsInt(this TypeX oValue)
        {
            return Int32.Parse(oValue.ToString());
        }
        public static Boolean GetValueAsBoolean(this TypeX oValue)
        {
            return Boolean.Parse(oValue.ToString());
        }


         TypeX x = new TypeX("1");
         TypeX y = new TypeX("true");


         //Method #1
         Int32 iXValue = x.GetValueAsInt();
         Boolean iYValue = y.GetValueAsBoolean();

         //Method #2
         Int32 iXValueDirect = Int32.Parse(x.ToString());
         Boolean iYValueDirect = Boolean.Parse(y.ToString());

Не увлекайтесь TypeX, говоря, что я должен определять эти методы внутри TypeX, а не в Extension). У меня нет контроля над ним (Actual Class I определил, что он находится на SPListItem.

Я хотел преобразовать TypeX в Int или Boolean, и эта операция - одна из распространенных вещей, которую я выполняю во многих местах кода. Я хотел знать, не приведет ли это к снижению производительности. Я пытался интерпретировать код IL с помощью Reflector, но у меня это не получается. Может быть, для приведенного выше примера не будет никакого снижения производительности. В общем, я хотел бы узнать о последствиях в отношении производительности при использовании методов расширения.

единственное снижение производительности будет происходить, когда вы расширяете тип объекта, но тогда это не относится к методам расширения. Смотрите ответ Эрика здесьstackoverflow.com/a/7652359/661933 nawfal

Ваш Ответ

4   ответа
1

В худшем случае у вас будет дополнительный вызов функции. Серьезно, однако, я надеюсь, что он сможет встроить этот код так просто, как он есть, и не иметь никакого заметного эффекта.

2

Вы не потерпите никакой производительности, поскольку все методы расширения связаны во время компиляции (как вы это скажете?).

да, хороший :)
& APOS; Решенный & APOS; во время компиляции?
24

Методы расширенияjust изменение времени компиляции из:

x.GetValueAsBoolean()

в

Extensions.GetValueAsBoolean(x)

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

Если у вас нет проблем с производительностью статического метода, то его превращение в метод расширения не вызовет каких-либо новых проблем.

РЕДАКТИРОВАТЬ: IL, как и просили ...

Взяв этот образец:

using System;

public static class Extensions
{
    public static void Dump(this string x)
    {
        Console.WriteLine(x);
    }
}

class Test
{
    static void Extension()
    {
        "test".Dump();
    }

    static void Normal()
    {
        Extensions.Dump("test");
    }
}

Здесь IL дляExtension а такжеNormal:

.method private hidebysig static void  Extension() cil managed
{
  // Code size       13 (0xd)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "test"
  IL_0006:  call       void Extensions::Dump(string)
  IL_000b:  nop
  IL_000c:  ret
} // end of method Test::Extension

.method private hidebysig static void  Normal() cil managed
{
  // Code size       13 (0xd)
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldstr      "test"
  IL_0006:  call       void Extensions::Dump(string)
  IL_000b:  nop
  IL_000c:  ret
} // end of method Test::Normal

Как вы можете видеть, они абсолютно одинаковы.

Упс. Редактирование - обычно это должен быть вызов Extensions.Dump (& quot; test & quot;).
Ваше желание для меня закон...
если бы вы только опубликовали образец IL, у вас было бы окончательное решение здесь :)
безусловно, лучший и наиболее полный ответ на этот вопрос
Sam & amp; Джон, я не понимаю пример IL. Дамп это метод расширения, я согласен. Оба Extension () и Normal () делают одно и то же. Очевидно, что он имеет тот же IL Kusek
4

поэтому они имеют все последствия для производительности обычных методов во время выполнения.

Похожие вопросы