Re[6]: [Этюд] Минутка WTF
От: Sinix  
Дата: 29.03.16 20:03
Оценка:
Здравствуйте, rameel, Вы писали:

R>Нее, именно это я давно понял, еще кажись Андрей Акиньшин на конфе об этом рассказывал, если не путаю.

Ну да, оно в куче мест упоминается, но на практике целенаправленно не используется.

Лично я зацепился за этот момент вот на этом ответе, если правильно нашёл.
И вот ещё статья на тему.


R>Я другого ждал, я ждал чуда Не знаю какого, но чуда

Вот так и знал, что с AggressiveInlining проверять не будут.
(для наглядности const int Count = 100 * 1000 * 1000;)
    DirectCall:   116ms, ips:         860 304 599,45 | Mem:       3,91 kb, GC 0/1/2: 0/0/0 => 100000000 (<==)
        Switch:   359ms, ips:         277 891 558,93 | Mem:       3,91 kb, GC 0/1/2: 0/0/0 => 100000000
   Switch (ro):   223ms, ips:         448 026 465,82 | Mem:       8,00 kb, GC 0/1/2: 0/0/0 => 100000000
            If:    76ms, ips:       1 311 236 377,89 | Mem:       8,00 kb, GC 0/1/2: 0/0/0 => 100000000
       If (ro):    39ms, ips:       2 550 051 128,53 | Mem:       2,52 kb, GC 0/1/2: 0/0/0 => 100000000 (<==)

Done


Мне что, на все пасхалки капсом примечания навешивать?
Re[7]: [Этюд] Минутка WTF
От: rameel https://github.com/rsdn/CodeJam
Дата: 29.03.16 20:16
Оценка: +1
Здравствуйте, Sinix, Вы писали:

S>Вот так и знал, что с AggressiveInlining проверять не будут.

S>Мне что, на все пасхалки капсом примечания навешивать?



С AggressiveInlining я как-то столкнулся с тем, что метод с достаточно объемным switch и пару while с оптмизировался до конкретной ветки, выкинув все остальное Но джиту конечно в рантайме было известно значение аргумента, хотя все равно приятно был удивлен
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[3]: [Этюд] Минутка WTF
От: Pro100Oleh Украина  
Дата: 29.03.16 20:45
Оценка: 44 (1)
Здравствуйте, Sinix, Вы писали:

S>…но тут есть один нюанс:

S>

S>Current versions of the CLR do not do this, but future versions might.


Ладно, зайдем с другой стороны. Добавляем:
        static Program()
        {
            Console.WriteLine(falseRO);
        }

... и ничего не меняется. Но меняем на:
        static Program()
        {
            Console.WriteLine(CaseB());
        }

... и вуаля:

B: Not set
A: Not set
B: Not set
C: Not set

A/B/C set? False, True, True

A: Not set
B: Set
C: Set
Done


Учитывая что MSIL методов никак не меняется, значит прикол в JIT. Самое простое объяснение — если при компиляции MSIL -> native статик конструктор уже выполнялся, то readonly поля можно заметить их значением.
Угадал?
Pro
Re[4]: [Этюд] Минутка WTF
От: Sinix  
Дата: 29.03.16 21:13
Оценка:
Здравствуйте, Pro100Oleh, Вы писали:

PO>Угадал?

Ага.
Компиляция метода выполняется _до_ завершения static-конструктора и JIT не может применить всех оптимизаций, т.к. конструктор может поменять значение переменной.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.