Сравнение строк и сравнение массивов в .NET - PullRequest
1 голос
/ 10 апреля 2011

У меня есть кусок кода, критичный к скорости, который включает сравнение 2 4-х байтовых массивов.Я пытался найти самый быстрый способ для достижения этой цели, и посмотрел на this .

Выполнение 100 000 000 сравнений с помощью pinvoke и memcmp занимает ~ 9,5 секунд, используя опубликованный метод UnsafeCompareв приведенной выше ссылке требуется ~ 3,5 секунды.

Если установить 2 строки из 4 символов и сравнить те, которые используют s1 == s2, то это займет ~ 0,5 секунды.Если я использую string.Compare (s1, s2), это займет около ~ 12 секунд.

Есть ли какой-нибудь способ, с помощью которого я могу сравнить свои байтовые массивы для сравнения, это скорость выполнения s1 == s2?И если нет, могут ли быть какие-либо проблемы со мной, если я сделаю что-то вроде ниже, в основном, храня мои байтовые массивы в виде строк?

        string s1 = Convert.ToChar(1).ToString() + Convert.ToChar(2).ToString() + Convert.ToChar(3).ToString() + Convert.ToChar(4).ToString();
        string s2 = Convert.ToChar(1).ToString() + Convert.ToChar(2).ToString() + Convert.ToChar(3).ToString() + Convert.ToChar(4).ToString();

        if (s1 == s2)
            .....

Надеясь, что кто-то может помочь мне с этим.Спасибо!

Ответы [ 2 ]

3 голосов
/ 10 апреля 2011

Я бы порекомендовал эти шаги:

  1. Сравните два 4-байтовых массива побайтно, т.е. a[0] == b[1] && … && a[3] == b[3]. Это будет намного быстрее , чем любые звонки на memcmp и тому подобное. Скорее всего, JIT-компилятор скомпилирует это в эффективную (и встроенную) последовательность инструкций. Вы сравниваете только четыре байта , вы не можете ожидать, что алгоритм, разработанный для сравнения произвольно длинных блоков памяти, будет работать лучше.

  2. Подумайте о том, чтобы хранить данные как 32-разрядные целые числа вместо 4-байтовых массивов. Это обеспечит еще один выигрыш в производительности, поскольку сравнение (a == b) будет преобразовано в одну 32-разрядную инструкцию сравнения.

  3. Попробуйте переосмыслить свой алгоритм - действительно ли необходимо выполнить 100 миллионов сравнений? Нет ли вариантов уменьшить временную сложность алгоритма? То, что даст значительный прирост производительности.

Однако, не зная более широкого контекста, трудно порекомендовать какую-либо лучшую и конкретную оптимизацию.

1 голос
/ 10 апреля 2011

Не пробовал это на скорость, но как насчет жесткого кодирования длины и проведения такого сравнения:

byte[] one = new byte[] { 0, 1, 2, 3 };
byte[] two = new byte[] { 0, 1, 2, 4 };

bool isEqual = ((one[0] == two[0]) && (one[1] == two[1]) && (one[2] == two[2]) && (one[3] == two[3]));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...