Рассмотрим две процедуры сравнения:
void compare(bitset<74>& a, bitset<74>& b){
for(int i=0; i<74; ++i){
if(a[i] != b[i]){
}
}
}
и
void compare(string& a, string& b){
for(int i=0; i<37; ++i){
if(a[i] != b[i]){
}
}
}
Сразу же вы можете видеть, что одна выполняет цикл 74
раз, а другая выполняетцикл 37
раз.Таким образом, уже подход с использованием битов начинается с позиции слабости.
Теперь рассмотрим типы данных, к которым осуществляется доступ;доступ к отдельным байтам достаточно быстрый;доступ к отдельным битам из любой структуры данных может хранить один бит во всем байте или, возможно, даже больший размер слова.Если он хранит биты в отдельных битах, то должны быть введены некоторые операции маскирования битов, и все они также потребляют вычислительную мощность.Если биты хранятся в байтах, то вы фактически сравниваете только половину каждого символа в каждом бите.Если биты хранятся в словах или больше, вы увеличиваете размер кэша данных ЦП - потенциально беря что-то, что могло бы поместиться полностью в одной строке кэша в несколько строк кэша.Это потенциальная возможность для гигантских штрафов за скорость, хотя на входах это мало, это, вероятно, еще не слишком ужасно.
Если вы замените свой bitset
на char[]
, который достаточно велик, чтобыДержите все свои данные, вручную установите биты в подпрограммах сжатия, , а затем сравните массив char[]
с байтом за раз или больше , вы, вероятно, можете значительно повысить скорость процедур сравнения.Будет ли ускорение достаточным для преодоления затрат на процедуры сжатия?Трудно сказать, и отчасти это зависит от того, сколько сравнений вы можете выполнить с каждой сжатой формой.
Если вы можете выполнить сравнение с использованием int
или более крупных типов данных, вы, вероятно, можете пойти еще значительно быстрее, так как современныеПроцессоры обычно быстрее обращаются к 4-байтным или 8-байтовым за раз, чем 1-байтовый за раз.Большинство подпрограмм strcmp(3)
или memcmp(3)
оптимизированы для выполнения огромных выровненных операций чтения.Если вы используете memcmp(3)
для сравнения, у вас будет больше шансов на максимальной скорости - и для сжатой, и для несжатой версий.