Повлияет ли использование var на производительность? - PullRequest
217 голосов
/ 10 декабря 2008

Ранее я задавал вопрос о , почему я вижу, что во многих примерах используется ключевое слово var , и получил ответ, что, хотя это необходимо только для анонимных типов, он, тем не менее, используется для написания кода «быстрее» / легче и «просто потому что».

После по этой ссылке ("C # 3.0 - Var Is Not Objec") Я видел, что var компилируется до нужного типа в IL (вы увидите это в середине статьи) .

У меня вопрос, насколько больше, если таковой имеется, IL-кода использует ключевое слово var, и будет ли оно даже близко к измеряемому уровню производительности кода, если бы он использовался повсеместно?

Ответы [ 12 ]

2 голосов
/ 01 апреля 2016

«вар» - это одна из тех вещей, которые люди либо любят, либо ненавидят (например, регионы). Хотя, в отличие от регионов, var абсолютно необходим при создании анонимных классов.

Для меня var имеет смысл, когда вы обновляете объект напрямую, например:

var dict = new Dictionary<string, string>();

Как говорится, вы можете легко сделать:

Dictionary<string, string> dict = new и intellisense заменит вас здесь.

Если вы хотите работать только с определенным интерфейсом, вы не можете использовать var, если только метод, который вы вызываете, не возвращает интерфейс напрямую.

Resharper, кажется, на стороне использования «var» повсюду, что может подтолкнуть больше людей, чтобы сделать это таким образом. Но я согласен, что читать сложнее, если вы вызываете метод, и неясно, что возвращает имя.

Вар сам по себе не тормозит, но есть одна оговорка, о которой не многие думают. Если вы сделаете var result = SomeMethod();, то код после этого ожидает некоторого результата назад, где вы будете вызывать различные методы или свойства или что-то еще. Если SomeMethod() изменил свое определение на какой-то другой тип, но он все же выполнил контракт, которого ожидал другой код, вы просто создали действительно неприятную ошибку (если, конечно, нет модульных / интеграционных тестов).

0 голосов
/ 24 мая 2019

Это зависит от ситуации, если вы попробуете использовать, этот код ниже.

Выражение преобразуется в «ОБЪЕКТ» и сильно снижает производительность, но это отдельная проблема.

КОД:

public class Fruta
{
    dynamic _instance;

    public Fruta(dynamic obj)
    {
        _instance = obj;
    }

    public dynamic GetInstance()
    {
        return _instance;
    }
}

public class Manga
{
    public int MyProperty { get; set; }
    public int MyProperty1 { get; set; }
    public int MyProperty2 { get; set; }
    public int MyProperty3 { get; set; }
}

public class Pera
{
    public int MyProperty { get; set; }
    public int MyProperty1 { get; set; }
    public int MyProperty2 { get; set; }
}

public class Executa
{
    public string Exec(int count, int value)
    {
        int x = 0;
        Random random = new Random();
        Stopwatch time = new Stopwatch();
        time.Start();

        while (x < count)
        {
            if (value == 0)
            {
                var obj = new Pera();
            }
            else if (value == 1)
            {
                Pera obj = new Pera();
            }
            else if (value == 2)
            {
                var obj = new Banana();
            }
            else if (value == 3)
            {
                var obj = (0 == random.Next(0, 1) ? new Fruta(new Manga()).GetInstance() : new Fruta(new Pera()).GetInstance());
            }
            else
            {
                Banana obj = new Banana();
            }

            x++;
        }

        time.Stop();
        return time.Elapsed.ToString();
    }

    public void ExecManga()
    {
        var obj = new Fruta(new Manga()).GetInstance();
        Manga obj2 = obj;
    }

    public void ExecPera()
    {
        var obj = new Fruta(new Pera()).GetInstance();
        Pera obj2 = obj;
    }
}

Выше результатов с ILSPY.

public string Exec(int count, int value)
{
    int x = 0;
    Random random = new Random();
    Stopwatch time = new Stopwatch();
    time.Start();

    for (; x < count; x++)
    {
        switch (value)
        {
            case 0:
                {
                    Pera obj5 = new Pera();
                    break;
                }
            case 1:
                {
                    Pera obj4 = new Pera();
                    break;
                }
            case 2:
                {
                    Banana obj3 = default(Banana);
                    break;
                }
            case 3:
                {
                    object obj2 = (random.Next(0, 1) == 0) ? new Fruta(new Manga()).GetInstance() : new Fruta(new Pera()).GetInstance();
                    break;
                }
            default:
                {
                    Banana obj = default(Banana);
                    break;
                }
        }
    }
time.Stop();
return time.Elapsed.ToString();
}

Если вы хотите выполнить этот код, используйте приведенный ниже код и получите разницу во времени.

        static void Main(string[] args)
    {
        Executa exec = new Executa();            
        int x = 0;
        int times = 4;
        int count = 100000000;
        int[] intanceType = new int[4] { 0, 1, 2, 3 };

        while(x < times)
        {                
            Parallel.For(0, intanceType.Length, (i) => {
                Console.WriteLine($"Tentativa:{x} Tipo de Instancia: {intanceType[i]} Tempo Execução: {exec.Exec(count, intanceType[i])}");
            });
            x++;
        }

        Console.ReadLine();
    }

Привет

...