Сообщение [FYI] Парочка новых возможностей JIT от 04.03.2017 15:08
Изменено 04.03.2017 16:03 rameel
[FYI] Парочка новых возможностей JIT
Для тех, кто не следил за CoreCLR в гитхабе.
Из примеров:
Что осталось можно посмотреть тут: JIT: devirtualization next steps
Оптмизация try-finally.
1. Устранение пустых finally блоков. Пустой finally получается, например, в случае использования using или foreach для классов с пустым Dispose методом. С учетом девиртуализации это будет работать и с классами, имеюшие пустой виртуальный Dispose.
Блок finally реализован как вызов метода, который теперь устраняется в случае пустых finally блоков.
Остальное побольшей части работает только для CoreCLR, в котором нет Thread.Abort, который мешает делать некоторые оптимизации, но не делает их невозможными, если получить поддержку со стороны рантайма. За подробностями прошу сюда: Finally Optimizations
Девиртуализация
Джит наконец-то научился девиртулизовывать вызов метода, а значит и инлайнить их. Текущий вариант назван 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 в гитхабе.
Из примеров:
Что осталось можно посмотреть тут: JIT: devirtualization next steps
Оптмизация try-finally.
1. Устранение пустых finally блоков. Пустой finally получается, например, в случае использования using или foreach для классов с пустым Dispose методом. С учетом девиртуализации это будет работать и с классами, имеюшие пустой виртуальный Dispose.
Блок finally реализован как вызов метода, который теперь устраняется в случае пустых finally блоков.
Остальное побольшей части работает только для CoreCLR, в котором нет Thread.Abort, который мешает делать некоторые оптимизации, но не делает их невозможными, если получить поддержку со стороны рантайма. За подробностями прошу сюда: Finally Optimizations
Девиртуализация
Джит наконец-то научился девиртулизовывать вызов метода, а значит и инлайнить их. Текущий вариант назван 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>>