для моей дипломной работы я написал программу (на C) для сортировки больших таблиц, и теперь все работает как надо.Однако для некоторых моих тестовых файлов программа работает немного медленно.Чтобы иметь возможность более эффективно хранить временные данные, пользователь может указать тип данных для каждого столбца таблицы.Затем входные данные сначала анализируются в некоторый двоичный формат, затем сортируются и, наконец, преобразуются обратно в текстовую форму.
Для каждого типа данных необходимо реализовать четыре функции (кодирование, декодирование, получение и сравнение) и указатели.к ним хранятся в массиве для каждого столбца.Итак, чтобы сделать что-нибудь со строкой таблицы, я должен вызвать правильную функцию для каждой строки в цикле, которая имеет значительные накладные расходы, если столбцы довольно короткие.
Например, здеськод моей функции сравнения строк (вызывается из qsort):
int line_cmp(const void *p1,const void *p2)
{
int i,o1=0,o2=0,r;
for(i=0;i<opt.nocols;i++)
if((r=(*opt.cols[i].cmp)(*(char* const*)p1,&o1,
*(char* const*)p2,&o2)))
return r;
return 0;
}
Эта функция циклически проходит по всем столбцам, и если вызываемая функция возвращает значение, отличное от 0 (что означает, что оно не равно), возвращается значение (простокак требует qsort).
Теперь мой вопрос: как можно оптимизировать эту (или аналогичную) функцию (если вообще возможно), особенно когда все указатели устанавливаются только один раз, а затем никогда не меняются в течение всей программы??
РЕДАКТИРОВАТЬ: я использую указатели функций, чтобы третье лицо могло разрабатывать произвольные типы данных.Затем они будут загружены (dlopen и т. Д.).Таким образом, я не могу придумать общий двоичный формат для сравнения столбцов, а двоичные данные - просто черный ящик для моей программы.