Две переменные time_t говорят start_sec и end_sec. Теперь мне нужно выполнить миллион операций, чтобы выяснить, попадает ли данный случайный time_t в этот диапазон.

if(given_sec >= start_sec && given_sec <= end_sec) {
    /* given_sec falls in the interval*/
}

Или

start_sec -= -1; //keep it for million comparisons
end_sec += 1; //keep it for million comparisons

if(given_sec > start_sec && given_sec < end_sec) {
    /* given_sec falls in the interval*/
}

Какой из них лучше?

Думаю, на уровне сборки je loc; jle loc; jg loc; jge loc используются для прыжков. Мне было интересно, сэкономит ли jg loc; jl loc циклы ЦП.

1
SparKot 30 Авг 2011 в 09:14

2 ответа

Лучший ответ

Прекрасный пример преждевременной оптимизации на микроуровне, заботы об отдельных циклах ЦП, которая ничего не дает, но запутывает ваш код - start_sec и end_sec больше не содержат значений, которые предполагают названия. И вы даже не так оптимизировали:

start_sec -= -1; //keep it for million comparisons

Это добавит единицу к start_sec.

Откуда берутся миллионы значений time_t? Входной файл? База данных? С системных часов? Генератор случайных чисел? Каждый из этих источников будет по величине медленнее, чем сравнение. Таким образом, даже если <и> на несколько циклов ЦП быстрее, чем <= и> = (для данного набора инструкций на данном конкретном ЦП), и профилирование показывает, что этот цикл на самом деле является вашим узким местом, эта «оптимизация» вряд ли решит Эта проблема. Специально для нескольких миллионов сравнений на современных процессорах с тактовой частотой ГГц и миллиардами циклов в секунду.

0
unkulunkulu 30 Авг 2011 в 11:56

Нет, они ничего не сохраняют, и если бы они были, оптимизатор все равно бы вам помог.

5
unkulunkulu 30 Авг 2011 в 05:16