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

Сообщение Re: Интересное падение производительности от 28.11.2014 9:42

Изменено 28.11.2014 10:05 Sinix

Здравствуйте, Димчанский, Вы писали:

Д>Коллеги наткнулись на интересное падение производительности. Подняли тему на stackoverflow.

Д>Наткнулись в реальном коде, им удалось воссоздать минимальный пример.

Немного поиграю в кэпа

1. Проблема с энумераторами. Чтобы проверить: заменяем list.Any(); на _list.GetEnumerator().MoveNext() и получаем ещё более забавные результаты.
2. JIT-выхлоп для самих вызовов не отличается, если я ничего не пропустил. Остаётся выравнивание на стеке/попадание в линии кэша процессора. Но чтобы так стабильно воспроизводилось на разных машинах?

Будет время — покопаюсь ещё.
Re: Интересное падение производительности
Здравствуйте, Димчанский, Вы писали:

Д>Коллеги наткнулись на интересное падение производительности. Подняли тему на stackoverflow.

Д>Наткнулись в реальном коде, им удалось воссоздать минимальный пример.

Немного поиграю в кэпа

1. Проблема с энумераторами. Чтобы проверить: заменяем list.Any(); на _list.GetEnumerator().MoveNext() и получаем ещё более забавные результаты.
2. JIT-выхлоп для самих вызовов не отличается, если я ничего не пропустил. Остаётся выравнивание на стеке/попадание в линии кэша процессора. Но чтобы так стабильно воспроизводилось на разных машинах?

Будет время — покопаюсь ещё.

UPD. в общем, вот вывод disassembly для кода,
            [MethodImpl(MethodImplOptions.NoInlining)]
            public void Run()
            {
                for (var i = 0; i < 8000000; i++)
                {
                    var a = _list.GetEnumerator();
                    a.MoveNext();
                }
            }

кому интересно — разбирайтесь
(инструкции для настройки студии для просмотра disassembly — тынц)