Информация об изменениях

Сообщение [FYI] Парочка новых возможностей JIT от 04.03.2017 15:08

Изменено 04.03.2017 16:03 rameel

[FYI] Парочка новых возможностей JIT
Для тех, кто не следил за CoreCLR в гитхабе.

Девиртуализация

Джит наконец-то научился девиртулизовывать вызов метода, а значит и инлайнить их. Текущий вариант назван simple devirtualization, работы в этом направлении еще много, но то что есть уже приятно радует Если раньше модификатор sealed class и sealed override ничего не говорили джиту, то теперь он их принимает в рассчет. Что может джит делать с виртуальными методами, а что нет, можно глянуть вот сюда: Devirtualization tests

Из примеров:
public static Base M()
{
    return new Derived();
}

public static int Main()
{
    // M should inline and expose an exact return type
    // which will trigger late devirt for both Foo() and Bar().
    M().Foo();
    M().Bar();
}

// Jit should inline this method and then devirtualize ToString()
static void Print(object o)
{
    Console.WriteLine(o.ToString());
}

public static int Main()
{
    Print("hello, world!");
    return 100;
}


Что осталось можно посмотреть тут: JIT: devirtualization next steps

Try-Finally


Оптмизация try-finally.

1. Устранение пустых finally блоков. Пустой finally получается, например, в случае использования using или foreach для классов с пустым Dispose методом. С учетом девиртуализации это будет работать и с классами, имеюшие пустой виртуальный Dispose.
Блок finally реализован как вызов метода, который теперь устраняется в случае пустых finally блоков.
static int Sum(List<int> x) {
    int sum = 0;
    foreach(int i in x) {
        sum += i;
    }
    return sum;
}


Остальное побольшей части работает только для CoreCLR, в котором нет Thread.Abort, который мешает делать некоторые оптимизации, но не делает их невозможными, если получить поддержку со стороны рантайма. За подробностями прошу сюда: Finally Optimizations
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
[FYI] Парочка новых возможностей JIT
Для тех, кто не следил за CoreCLR в гитхабе.

Девиртуализация

Джит наконец-то научился девиртулизовывать вызов метода, а значит и инлайнить их. Текущий вариант назван simple devirtualization, работы в этом направлении еще много, но то что есть уже приятно радует Если раньше модификатор sealed class и sealed override ничего не говорили джиту, то теперь он их принимает в рассчет. Что может джит делать с виртуальными методами, а что нет, можно глянуть вот сюда: Devirtualization tests

Из примеров:
public static Base M()
{
    return new Derived();
}

public static int Main()
{
    // M should inline and expose an exact return type
    // which will trigger late devirt for both Foo() and Bar().
    M().Foo();
    M().Bar();
}

// Jit should inline this method and then devirtualize ToString()
static void Print(object o)
{
    Console.WriteLine(o.ToString());
}

public static int Main()
{
    Print("hello, world!");
    return 100;
}


Что осталось можно посмотреть тут: JIT: devirtualization next steps

Try-Finally


Оптмизация try-finally.

1. Устранение пустых finally блоков. Пустой finally получается, например, в случае использования using или foreach для классов с пустым Dispose методом. С учетом девиртуализации это будет работать и с классами, имеюшие пустой виртуальный Dispose.
Блок finally реализован как вызов метода, который теперь устраняется в случае пустых finally блоков.
static int Sum(List<int> x) {
    int sum = 0;
    foreach(int i in x) {
        sum += i;
    }
    return sum;
}


Остальное побольшей части работает только для CoreCLR, в котором нет Thread.Abort, который мешает делать некоторые оптимизации, но не делает их невозможными, если получить поддержку со стороны рантайма. За подробностями прошу сюда: Finally Optimizations
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
jit inlining optimization devirtualization