Информация об изменениях

Сообщение Re: v-table vs if call от 06.12.2022 23:03

Изменено 06.12.2022 23:08 vsb

Re: v-table vs if call
vtable это запрос в память. Если не в кеше, то очень дорого. Если в кеше, то быстро. Но если перед этим есть ещё один запрос в память, то может предсказать и заранее запросить. Тогда будет быстро.

if это практически гарантированно очень быстро. Код же у тебя более-менее компактно расположен. В крайнем случае потратит сколько-то циклов, выполняя неправильно предсказанную ветку, но это мелочи в сравнение с запросом в память.

В общем однозначно сказать нельзя. Если у тебя будет миллион if-ов непредсказуемых, то процессор запутается. Если ты по одному объекту вызываешь кучу разных методов и vtable не вытесняется из кеша, то будет быстро. Если ты ни с того ни с сего взял и вызвал виртуальный метод и процессору пришлось ждать полного цикла запроса в память, это грустно.

struct и class это одно и то же.

По твоему вопросу — без разницы. Расходы на переключение между ядром и юзерспейсом настолько огромны, что на их фоне меркнет всё.

По коду — я бы сделал что-то вроде struct { void (*handler)(uint8_t *data, uint32_t length, void *ctx); void *ctx; } то бишь структуру из указателя на функцию и void* контекста. На указатель присваивал бы нужную реализацию, на ctx нужные данные (если они вообще нужны.

Ну на C++ наверное надо два класса объявить. Один внутренний с виртуальным методом и один наружний, который будет держать указатель на внутренний, а в epoll уже отдавай указатель на наружний класс.
Re: v-table vs if call
vtable это запрос в память. Если не в кеше, то очень дорого. Если в кеше, то быстро. Но если перед этим есть ещё один запрос в память, то может предсказать и заранее запросить. Тогда будет быстро.

if это практически гарантированно очень быстро. Код же у тебя более-менее компактно расположен. В крайнем случае потратит сколько-то циклов, выполняя неправильно предсказанную ветку, но это мелочи в сравнение с запросом в память.

В общем однозначно сказать нельзя. Если у тебя будет миллион if-ов непредсказуемых, то процессор запутается. Если ты по одному объекту вызываешь кучу разных методов и vtable не вытесняется из кеша, то будет быстро. Если ты ни с того ни с сего взял и вызвал виртуальный метод и процессору пришлось ждать полного цикла запроса в память, это грустно.

struct и class это одно и то же.

По твоему вопросу — без разницы. Расходы на переключение между ядром и юзерспейсом настолько огромны, что на их фоне меркнет всё.

По коду — я бы сделал что-то вроде struct { void (*handler)(uint8_t *data, uint32_t length, void *ctx); void *ctx; } то бишь структуру из указателя на функцию и void* контекста. На указатель присваивал бы нужную реализацию, на ctx нужные данные (если они вообще нужны).

Ну на C++ наверное надо два класса объявить. Один внутренний с виртуальным методом и один наружний, который будет держать указатель на внутренний, а в epoll уже отдавай указатель на наружний класс.

Ну или тупо указатель на указатель.