Сравнение на низове strcmp или символ по символ

Търсех отговор на въпроса "кое е по-бързо"

И, изглежда, намери ...

Проверете дали низът е "специален маркер". Маркерите са общо пет: “първи”, “последен”, “четен”, “нечетен”, “изход” и програмата завършва с “изход”.

През няколкото дни, в които изучавах C, се натъкнах на два подхода за сравнение: функцията strcmp и байт по байт (известен още като символ по знак). Мненията на познати и колеги за това кой подход работи по-бързо са разделени. Така че имате нужда от бенчмарк.

Решението, използващо strcmp, ще нарека bench_str:

Решението за сравнение байт по байт, което ще нарека bench_char:

Те се компилират и работят по същия начин:

Входни данни

Използвайте любимия си скриптов език, за да създадете файл, съдържащ доста редове за въвеждане. Отне ми 10 милиона реда, за да може времето за изпълнение да отнеме няколко секунди. При по-кратки интервали разликата в скоростта може да не е толкова забележима и влиянието на други процеси, които изяждат вашия процесор, ще има по-силен ефект.

Направих make_input.php:

Обърнете внимание, че тъй като входът се чете неограничено докато (scanf("%s", in)), последният ред във файла е "изход" - в противен случай програмата ще зацикли.

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

Натисни бутона, Макс!

Хайде да го направим! Пренасочих изхода към /dev/null, за да не губя ресурси за показване на резултата на екрана: това също въвежда грешка и отнема доста време. Ако няма да пренасочвате изхода, препоръчвам да намалите броя на входните редове споръчка или две.

И така, на сцената, сравнение байт по байт:

На етапа strcmp:

Разбира се, резултатите варират леко от изпълнение до изпълнение, но общата картина е същата: strcmp е с около половин секунда по-бърз, което е с около 20% по-бързо! А за четливостта на кода дори мълча.

В краен случай можете да оставите само правилни линии или само неправилни.

В случай на използване само на валидни низове, времето за изпълнение на двете реализации се намалява и предимството на strcmp пада до 15%:

В случай на използване само на невалидни низове, времето за изпълнение на bench_char не се променя много, но bench_str отнема малко повече време.Като цяло предимството на strcmp пада до около 10%:

Снимка за този случай:

Случай #1: само правилни низове Случай #2: смесване Случай #3: само неправилни низове

Ако някой знае защо греша и в какъв случай ще има обратна картина, ще бъде много интересно да разширя кръгозора си. Но ако някой разкаже подробно защо е така, като цяло ще е супер яко!