Кто-то публикует замер, одна версия быстрее на 8 процентов, дальше обсуждают почему. Я и сам публиковал такие числа. Чего я никогда не делал, так это не выяснял, что говорит моя собственная машина, когда находить нечего. Поэтому написал самый маленький вариант: 1 функция, объявленная дважды под двумя именами, замеряется сама против себя. Настоящая разница между ними равна нулю по построению.
Внутри раунда они чередуются, сначала A, потом B, чтобы любой дрейф машины бил по обоим. 200 раундов, цикл по 200000 чисел, тихий Linux-сервер с 4 ядрами, без другой нагрузки.
Первый раунд занял 2.118 миллисекунды. Установившаяся медиана 0.593. Это в 3.57 раза. Единственная часть истории, про которую все и так знают.
Теперь то, чего я не знал. Возьми 1 раунд A и стоящий рядом 1 раунд B. Это и есть замер, сделанный один раз. Из 180 установившихся пар 19, то есть 10.6 процента, выдают победителя с разрывом больше 5 процентов. Худшая пара ставит одинаковый код на 32.9 процента впереди себя же.
Значит человек, который прогнал каждую версию по разу, увидел 8 процентов и написал об этом, не делает ничего необычного. Он берёт выборку из распределения, которое врёт на 5 процентов один раз из девяти.
Сколько раундов сколько покупают
Лекарство это повторение. Так говорят все. Полезный вопрос в другом: сколько повторений сколько точности покупает. Я нарезал установившиеся раунды окнами и посмотрел, насколько гуляет медиана между окнами одного размера.
1 раунд гуляет на 35.6 процента. 3 раунда на 5.1. 5 раундов 2.8, 10 раундов 2.3, 30 раундов 0.2. Полезна тут форма: почти вся выгода лежит в первой горстке повторов. Последний отрезок с 10 до 30 покупает уже ту точность, которая нужна, чтобы защищать небольшое утверждение.
Два процента, которые не сидели на месте
Медианы A и B разошлись на 2.04 процента. Код одинаковый. 2 процента это ровно тот размер разницы, про который пишут в блогах, поэтому я пошёл искать причину. Догадка была про позицию: A всегда идёт в раунде первым, B вторым, значит второй может попадать на прогретый кеш.
Я их поменял местами. В перевёрнутом порядке знак перевернулся, минус 1.84 процента, что догадке соответствует. Потом прогнал оба порядка ещё раз. Обычный порядок дал плюс 2.24 процента, потом минус 0.07. Перевёрнутый дал плюс 0.12.
3 прогона из 5 показывают эффект порядка, 2 не показывают ничего. Значит и объяснение назвать устойчивым нельзя. Разница в 2 процента на этой машине это не маленький эффект, который я мог бы догнать более аккуратным тестом. На такой выборке она не приписывается ничему. Честный отчёт звучит так: я не знаю, откуда она взялась.
Чего я не проверял
Переносится ли это куда-нибудь. Здесь 1 плотный числовой цикл без единого выделения памяти, поэтому сборщик мусора не запускается ни разу. Самый крупный источник дрожания в настоящей программе отсутствует в опыте целиком. Я не трогал управление частотой на хосте, а оно двигает ядра ровно под такой нагрузкой. И не повторил ничего на второй машине, значит измеренный уровень шума принадлежит этой коробке в этот вечер.
Узкое утверждение это привычка, а не число. Прежде чем поверить в разницу, померь уровень шума той установки, которая её выдала, сравнив что-нибудь само с собой. Всё, что ниже этого уровня, считай ничем. Здесь уровень около 2 или 3 процентов при 200 раундах. Одиночные прогоны бесполезны вплоть до 33.