Как нас всех обманули

от автора

Заключительное опровержение статьи «Быстрее, чем C++; медленнее, чем PHP». Идея заключалась в том, что разные языки имеют разную производительность кода. Разберемся на конкретном примере почему же это не совсем так.

В статье утверждалось что язык C выполняется быстрее языка C++. При внимательном изучении кода, и копировании части кода в язык C++, обнаружилась тривиальная проблема, код на языке C и язык C++ отличался всего лишь последовательностью поиска минимального числа из трех возможных. Дело в том, что последовательность проверок устроена так, что процессор предсказывает возможный переход для ускорения выполнения кода. Этот «бенчмарк» был создан только на пограничных условиях строчка с одними “a” и строчка только с “b”, таким образом чаще всего выполнялся один переход из трех.

Что нужно сделать чтобы код работал с идентичной скорость как на C, так и на C++. Здесь три пути решения. Переставляем последовательность проверок переменных в одинаковую последовательность:

Проверяем substCost, delCost, а потом insCost (самый быстрый вариант, как на языке C).

v1[j + 1] = std::min(std::min(substCost, delCost), insCost);

Проверяем substCost, insCost, а потом delCost (быстрый вариант).

v1[j + 1] = std::min(std::min(substCost, insCost), delCost);

Проверяем delCost, insCost, а потом substCost (медленный вариант)

v1[j + 1] = std::min(std::min(delCost, insCost), substCost);

Существует альетрнативный путь, с учетом того, что реальные данные больше похожи на случайное распределение. Исходные строки заполняются случайными данными (“a” и “b”), в таком случае неважна последовательность проверки переменных.

Такими нехитрыми манипуляциями мы либо ускоряем, либо замедляем выполнение кода. Одинаковая последовательность проверки переменных на двух языках, выдает одинаковое время исполнения.

P. S. Спасибо всем кто отписался в личку и тестировал данный код.

ссылка на оригинал статьи https://habr.com/ru/post/485292/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *