Точно сравнителен код

Трябва да измеря ефективността на моя код с максимална възможна точност.

В момента използвам:
- Хронометър за измерване на времето
- Задаване на афинитет на процеса за използване на едно и също процесорно ядро ​​през цялото време
- Задаване на максимален приоритет на нишката
- Извършване на загряване преди измерване
- Изпълнете тест 1000 пъти и изчислете средната стойност

Въпреки това все още имам разлика между бенчмарковете (около 1% максимум). Някакви идеи как да направя това измерване по-прецизно?


person user626528    schedule 21.03.2013    source източник
comment
Това може да звучи злобно, но: напишете своя собствена операционна система, която да не изпълнява 200 други процеса едновременно? Сериозно, всеки друг работещ процес ще повлияе на резултата от вашия бенчмарк. Наистина ли е толкова много 1% разлика само при 1000 преминавания? =)   -  person J. Steen    schedule 21.03.2013
comment
Наистина, не се тревожете за 1% разлика при операционна система, която не работи в реално време!   -  person Matthew Watson    schedule 21.03.2013


Отговори (3)


Това може да е очевидно, но вашият процесор не е посветен на вашия единствен процес. Той също така отговаря за много други неща за операционната система и хардуера.

Освен това използването на паметта, използването на HDD и поведението на GC може да варира между изпълненията. Може би вашите изчисления се нуждаят от виртуална памет, която е много по-бавна от достъпа до RAM. И така нататък...

Относно GC, можете да опитате да си поиграете с различни настройки на "GCSettings.LatencyMode ", за да видите дали променя нещо (вижте http://blogs.microsoft.co.il/blogs/sasha/archive/2008/08/10/low-latency-gc-in-net-3-5.aspx например).

В една сесия на същия компютър, Хронометърът е доста точен: ако продължителността се различава между изпълнението, това вероятно не е поради липса на точност на измерването, а защото самият процес не отнема винаги едно и също време... Очевидно, всяко „итериране“ на вашия тест трябва да отнеме поне няколкостотин милисекунди, Хронометърът никога няма да може да измери продължителност в наносекунди...

И вариацията от 1% изобщо не е изненадваща.

person AFract    schedule 21.03.2013

Има ли някаква причина производителността да се различава, като външен компонент?

1% вариация не е много над 1000 изпълнения на производителност, особено ако зависи от нещо външно, като връзка с база данни или услуга.

Хронометърът е най-точният метод за измерване на времето, така че не бих се притеснявал за това

person finman    schedule 21.03.2013
comment
Работят ли други процеси? Можете ли да зададете афинитета на ядрото на процесора към нещо различно от CPU0? Когато казвате 1% разлика, какви са времената, вариращи от и до? Редки ли са извънредните стойности или резултатът от синхронизацията е доста разпространен (стандартното отклонение) - person finman; 21.03.2013

  1. Изпълнете кода за загряване за поне 10 секунди, преди да започна моите измервания. Необходимо е да се гарантира, че процесорът работи на максимална скорост.

  2. Измерете най-ниското време на работа, а не средното.

С тези 2 подобрения постигнах много стабилни резултати от измерването.

person user626528    schedule 21.06.2013