C ++ проблемы с выбором функции во время выполнения - PullRequest
1 голос
/ 21 января 2011

Я на базовом уровне с C ++, поэтому извините, если я упускаю что-то очевидное.

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

В одной точке цикла код выполняет разные действия в зависимости от того, в каком режиме он был установлен из файла конфигурации.

Очевидно, я мог бы использовать IF.Если в режиме 1 выполнить действие1, то в другом случае, если в режиме 2 выполнить действие2.Но я хотел бы сэкономить время, которое займет IF (имея в виду, что это произойдет миллионы раз).

Для этого я подумал о том, чтобы поместить actions1 и actions2 в их собственные функции и использовать указатель на функцию.

Затем я могу установить указатель на функцию, так как файл конфигурации читается перед циклом, и просто использовать этот указатель вместо IF.

Но проблема в том, что когда они помещаются в функции actions1и actions2 имеют разные аргументы, и поэтому мне нужно два указателя на функции, чтобы учесть это значение. Я снова нуждаюсь в IF.

Я мог бы решить эту проблему, используя глобальные переменные, но я бы не стал.Кто-нибудь может предложить способ решить эту проблему?

Или я не должен беспокоиться о стоимости миллионов IF, увидит ли компилятор, что решение выполнено, и не будет делать его снова и снова?

РЕДАКТИРОВАТЬ: Спасибо за ваши ответы.Я сделал тест, используя этот очень простой код:

int i = 2

int p = 10;

for (int f = 0; f<900000000; f ++) </p>

{

if (p == 10)
i = p + f;

}

На самом деле он работает на 20% быстрее, если есть, чем когда я его комментирую.Я предполагаю, что это должно быть ветвь hpredictor в действии, но я до сих пор не знаю, почему это быстрее, чем когда no вообще используется.

Ответы [ 3 ]

3 голосов
/ 21 января 2011

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

3 голосов
/ 21 января 2011

На большинстве современных процессоров, таких как x86, есть «предиктор ветвления».Сам процессор наблюдает шаблоны в том, была ли взята условная ветвь или нет;если вы всегда принимаете одно и то же решение, то оно должно быть очень эффективным.

Лучшее, что нужно сделать, - это просто измерить.Напишите свой код цикла, во-первых, без каких-либо условий (то есть просто жестко запишите его, чтобы выполнить действие № 1), и измерьте, сколько времени потребуется для выполнения, например, 10 миллионов итераций.Затем верните оператор if и измерьте снова.Бесполезно беспокоиться, пока вы не подтвердите, что это имеет значение!

2 голосов
/ 21 января 2011

Я на базовом уровне с C ++, поэтому, пожалуйста, извините, если я упускаю что-то очевидное.

Кажется, что очевидным решением является перемещение if за пределыпетля.Вместо записи:

while (...)
{
    if (flag)
    {
        // ...
    }
    else
    {
       // ...
    }
}

вы можете написать:

if (flag)
{
    while (...)
    {
        // ...
    }
}
else
{
    while (...)
    {
        // ...
    }
}
...