Должен ли я использовать разные в моих запросах

В vb.net или C # я ожидал бы, что самый быстрый общий подход к сопоставлению переменной с любым разумным количеством отдельно названных объектов (в отличие от, например, всех вещей в коллекции) будет состоять в том, чтобы просто сравнить каждый объект с сравнение и многое, что вы сделали. Конечно, возможно создать экземпляр коллекции и посмотреть, содержит ли он этот объект, и это может быть более выразительным, чем сравнение объекта со всеми элементами отдельно, но если вы не используете конструкцию, которую компилятор может явно распознать, такой код почти наверняка будет намного медленнее, чем просто делать отдельные сравнения. Я бы не стал беспокоиться о скорости, если код по своей природе будет работать не более нескольких сотен раз в секунду, но я бы опасался, что код будет перенаправлен на то, что выполняется гораздо чаще, чем первоначально предполагалось.

Альтернативный подход, если переменная является чем-то вроде типа перечисления, заключается в выборе значений перечисления мощности из двух, позволяющих использовать битмаски. Если тип перечисления имеет 32 или менее допустимых значений (например, начиная с Harry = 1, Ron = 2, Hermione = 4, Ginny = 8, Neville = 16), можно хранить их в целых числах и проверять сразу несколько бит в одном ((if ((thisOne & amp; (Harry | Ron | Neville | Beatrix))! = 0) / * Сделайте что-то * /. Это позволит быстро скопировать код, но ограничивается перечислениями с небольшим количеством значений.

Несколько более мощный подход, но тот, который должен использоваться с осторожностью, заключается в использовании некоторых бит значения для указания атрибутов чего-либо, в то время как другие биты идентифицируют элемент. Например, бит 30 может указывать, что персонаж - мужчина, бит 29 может указывать на друга Гарри и т. д., в то время как младшие бит различают символы. Этот подход позволил бы добавить персонажей, которые могут быть или не быть друг-Гарри, не требуя кода, который проверяет для друга Гарри изменить. Одно из предостережений заключается в том, что нужно различать константы перечисления, которые используются для установки en umeration value и те, которые использовались для тестирования. Например, чтобы установить переменную, указывающую на Гарри, можно было бы установить ее на 0x60000001, но чтобы увидеть, есть ли переменная IS Harry, нужно ее протестировать с помощью 0x00000001.

Еще один подход, который может быть полезным, если общее количество возможных значений является умеренным (например, 16-16 000 или около того), чтобы иметь массив флагов, связанных с каждым значением. Затем можно было бы закодировать что-то вроде «if (((characterAttributes [theCharacter] & amp; chracterAttribute.Male)! = 0)». Этот подход будет работать лучше всего, если количество символов довольно невелико. Если массив слишком велик, промахи в кеше могут замедлить код до такой степени, что тестирование против небольшого количества символов будет выполняться быстрее.

13
задан Taku_ 11 November 2015 в 13:21
поделиться