Сообщение Re: Интересное падение производительности от 28.11.2014 9:42
Изменено 28.11.2014 10:05 Sinix
Здравствуйте, Димчанский, Вы писали:
Д>Коллеги наткнулись на интересное падение производительности. Подняли тему на stackoverflow.
Д>Наткнулись в реальном коде, им удалось воссоздать минимальный пример.
Немного поиграю в кэпа
1. Проблема с энумераторами. Чтобы проверить: заменяем list.Any(); на _list.GetEnumerator().MoveNext() и получаем ещё более забавные результаты.
2. JIT-выхлоп для самих вызовов не отличается, если я ничего не пропустил. Остаётся выравнивание на стеке/попадание в линии кэша процессора. Но чтобы так стабильно воспроизводилось на разных машинах?
Будет время — покопаюсь ещё.
Д>Коллеги наткнулись на интересное падение производительности. Подняли тему на stackoverflow.
Д>Наткнулись в реальном коде, им удалось воссоздать минимальный пример.
Немного поиграю в кэпа
1. Проблема с энумераторами. Чтобы проверить: заменяем list.Any(); на _list.GetEnumerator().MoveNext() и получаем ещё более забавные результаты.
2. JIT-выхлоп для самих вызовов не отличается, если я ничего не пропустил. Остаётся выравнивание на стеке/попадание в линии кэша процессора. Но чтобы так стабильно воспроизводилось на разных машинах?
Будет время — покопаюсь ещё.
Re: Интересное падение производительности
Здравствуйте, Димчанский, Вы писали:
Д>Коллеги наткнулись на интересное падение производительности. Подняли тему на stackoverflow.
Д>Наткнулись в реальном коде, им удалось воссоздать минимальный пример.
Немного поиграю в кэпа
1. Проблема с энумераторами. Чтобы проверить: заменяем list.Any(); на _list.GetEnumerator().MoveNext() и получаем ещё более забавные результаты.
2. JIT-выхлоп для самих вызовов не отличается, если я ничего не пропустил. Остаётся выравнивание на стеке/попадание в линии кэша процессора. Но чтобы так стабильно воспроизводилось на разных машинах?
Будет время — покопаюсь ещё.
UPD. в общем, вот вывод disassembly для кода,
кому интересно — разбирайтесь
(инструкции для настройки студии для просмотра disassembly — тынц)
Д>Коллеги наткнулись на интересное падение производительности. Подняли тему на 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 — тынц)