Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Инлайн C#


Автор: NightmareZ 27.12.2007, 22:44
Два куска кода:
Код

using System;

namespace ConsoleApplication2
{
    public static class Ex
    {
        public static int Add(this int i, int j)
        {
            return i + j;
        }

        public static int Sub(this int i, int j)
        {
            return i - j;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            int m = 0;

            for (int i = 0; i < 10000; i++)
            {
                for (int j = 0; j < 10000; j++)
                {
                    for (int k = 0; k < 5; k++)
                    {
                        m += (i - (j + k));
                        //m = m.Add(i.Sub(j.Add(k)));
                    }
                }
            }

            Console.WriteLine(m);
            Console.ReadLine();
        }
    }
}


Код

using System;

namespace ConsoleApplication2
{
    public static class Ex
    {
        public static int Add(this int i, int j)
        {
            return i + j;
        }

        public static int Sub(this int i, int j)
        {
            return i - j;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            int m = 0;

            for (int i = 0; i < 10000; i++)
            {
                for (int j = 0; j < 10000; j++)
                {
                    for (int k = 0; k < 5; k++)
                    {
                        //m += (i - (j + k));
                        m = m.Add(i.Sub(j.Add(k)));
                    }
                }
            }

            Console.WriteLine(m);
            Console.ReadLine();
        }
    }
}

Почему первый работает быстрее? Почему JIT-компилятор не инлайнит функции? Компилял в релизе под 2008 студией.

Автор: tol05 28.12.2007, 00:23
а почему компилятор должен инлайнить функции? smile

насколько я знаю, в .Net инлайнятся только константы и литералы. 
К тому же, методы компилируются JIT-ом в свои участки памяти, Add, Sub и Main - каждый в свой собственный.

Автор: stab 28.12.2007, 00:33
если вот так записать, то инлайнит:
Код

int temp = j.Add(k);
m = m.Add(i.Sub(temp));


-1 джитеру smile

Автор: mr.DUDA 28.12.2007, 10:59
Что-то я туплю... Ключевое слово "this" перед аргументом i для чего ?

Автор: QryStaL 28.12.2007, 11:39
Это в C# 3.0 появилось - Extension methods. Если вкратце - в данном случае у типа int появляется 2 "дополнительных" метода: Add и Sub.

Автор: tol05 28.12.2007, 11:58
мда... я тоже протупил. Только начал третий FW изучать... 
Мда, похоже компилятор значительно изменился, а я пока являюсь "источником устаревшей информации"  smile 

Автор: QryStaL 28.12.2007, 12:14
Если кому интересно, http://blogs.gotdotnet.ru/personal/Snaky/PermaLink.aspx?guid=646342DB-6AFF-40FD-886B-9CC427DC58E4.

Автор: mr.DUDA 28.12.2007, 12:44
Может потому и не инлайнит, что это не обычный метод ? smile

Автор: stab 28.12.2007, 15:29
mr.DUDA, да не, джитер тупит просто. обычные подрихтованые статические методы + новый синтаксис. кому сахорок? налетай! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)