Найти тему

C# string Array.IndexOf

В комментариях заметили интересное поведение при поиске строки в массиве. Если сделать Array.IndexOf по массиву строк, то скорость получается несколько ниже простого перебора в foreach со сравнением через Equals.

Array<string>.IndexOf performance
Array<string>.IndexOf performance

Было предположение, что проблема в EqualityComparer<string>.Default (который, на самом деле GenericEqualityComparer<string>), но и это оказалось не верным предположением. То есть проблема где-то в Array.IndexOf.

Оказалось верным подтвержденное бенчмарком предложение, что проблема в JIT:

Предполагаю, что в случае выделения цикла в отдельный метод, JIT оптимизатор находит какой-то паттерн применения и выполняет оптимизацию.


То есть если переписать метод особым образом, то скорость будет норм. Предположение основано на
статье, описывающей оптимизации в JIT.

Бенчмарк в комментах в телеграмм. Бенчмарк с предположением там же. Коллеги, также, написали репорт о проблемах с производительностью.

Мой канал в TG: https://t.me/csharp_gepard