Быстрее сравнивать строковые или байтовые массивы? - PullRequest
0 голосов
/ 25 августа 2011

Итак, это может звучать странно, но быстрее ли сравнивать 2 строки или байта [] (используя Arrays.equals () )? Я работаю с Hadoop / Hbase, и я получаю byte [] в качестве значения от Hbase, и у меня есть значение, которое передается. Будет ли быстрее преобразовать полученное значение в строку и сравнить? Или сравнивать их как с байтовыми массивами?

Ответы [ 3 ]

2 голосов
/ 25 августа 2011

Без реального тестирования это может показаться, что Array.equals () - ваш друг.Чтобы создать строку, вы в конечном итоге создаете копию байтового массива в конструкторе String, затем вам необходимо декодировать юникод, который включает в себя создание декодера для кодировки Юникод по умолчанию и преобразование байтового массива в массив символов, а затемдолжны сделать равенства, что включает в себя итерацию по каждому символу в каждой из строк.

Таким образом, при вычислении типа O () вы уже должны прочитать каждый байт в массиве, чтобы выполнить преобразование в символ, поэтому я бы сказал, что сложность при преобразовании в String для равных равняется.

Обновление: учитывая комментарии, добавленные к вопросу, похоже, что вы получили строку и используете ее для сравнения с несколькими результатами в задании MapReduce.В этом случае кажется, что существует одно преобразование входной строки в байты, и они сравниваются с множеством байтовых массивов.Это кажется быстрее, чем оставить входную строку и преобразовать каждый байтовый массив, возвращенный в задании.

1 голос
/ 26 августа 2011

Во-первых, вы должны спросить себя, действительно ли это имеет значение. Учитывая, что вы имеете дело с HBase и, следовательно, с сетевым взаимодействием, все, что вы делаете, может быть полностью забито с точки зрения времени. Как и @Clint и @Suraj, я думаю, что вам, вероятно, лучше с меньшим количеством вызовов методов (то есть с использованием Array.equals ()). Просто подумайте о том, что должно произойти, когда вы делаете String равными, а затем добавьте накладные расходы на преобразование байтовых массивов в Strings.

1 голос
/ 25 августа 2011

Во-первых, вы должны рассмотреть, имеют ли обе строки одинаковую кодировку.Затем, если вы просто хотите получить проверку на равенство, продолжайте сравнение байтов.Но если вы хотите иметь поведение * String compareTo , вам, возможно, придется выяснить, как узнать, какая строка больше или меньше, и в этом случае я бы предпочел сначала преобразовать в String, а затем сравнить.

Если они не имеют одинаковую кодировку, то лучше создать строки и сравнить их, поскольку часть декодирования будет выполняться самим классом String.

...