Писал фильтр для обработки изображения. В одной функции делать всю обработку тяжело(иногда идет дублирование кода, чтение усложняется и т.д.). Решил написать тестовую программу, чтобы определить как влияет разбивка кода на множество функций во имя не дублирования.
Оказывается третий тест в котором вызывается только один метод — самый медленный, хотя я ожидал этого от второго теста. Кто нибудь может объяснить это явление?
То он как и ожидалось чуть-чуть быстрее второго теста
---------------
Test1
---------------
22.10.2010 16:11:30:328
22.10.2010 16:11:35:328
01.01.0001 0:00:05:0
Здравствуйте, SanyaVB, Вы писали:
SVB>Оказывается третий тест в котором вызывается только один метод — самый медленный, хотя я ожидал этого от второго теста. Кто нибудь может объяснить это явление?
1) Такие небольшие статические методы легко инлайнятся JIT-ом.
2) В третьем тесте также происходит инлайн.
В итоге Вы фактически измерлии оптимизацию "разворачивание цикла".
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, SanyaVB, Вы писали:
SVB>>Оказывается третий тест в котором вызывается только один метод — самый медленный, хотя я ожидал этого от второго теста. Кто нибудь может объяснить это явление?
H>1) Такие небольшие статические методы легко инлайнятся JIT-ом. H>2) В третьем тесте также происходит инлайн.
H>В итоге Вы фактически измерлии оптимизацию "разворачивание цикла".
Упс — фигню сказал толком не посмотревши на тесты. Действительно забавная ситуация.
Мне кажется нужно взглянуть что за код создает JIT компилятор и понять, как он интерпретируется процессором. Видимо в этом загвоздка.
Здравствуйте, cvetkov, Вы писали:
C>теоретически там меньше джампов.
C>практически: почему ты считаеш что методы не заинлайнились например? C>а что если запутьить тесты несколько раз?
Здравствуйте, hardcase, Вы писали:
H>Упс — фигню сказал толком не посмотревши на тесты. Действительно забавная ситуация.
Да не, всё правильно вы сказали.
1. Инлайн
-и-
2. Ручная развёртка цикла -> повышение производительности за счёт меньшего числа джампов (cvetkov выше тож отметился)
SVB>Оказывается третий тест в котором вызывается только один метод — самый медленный, хотя я ожидал этого от второго теста. Кто нибудь может объяснить это явление?
А что тут странного?
Во втором тесте вызовы идут пачкой друг за другом,
а в третьем тесте — после каждого вызове идёт ещё инкремент и проверка i.
Если интересно — поставьте брейкпойнт и переключитесь в окно дизассемблера.
Кстати, надеюсь, вы время измеряли в релиз — версии?
Ещё, вроде бы, на тайминг влияет то, запущена программа из-под Visual Studio или напрямую.