Я постараюсь быть максимально ясным со своим вопросом (не легко … это не так ясно и для меня).
Предположим, у вас есть набор инструкций IF … THEN с несколькими операндами, например
IF ((a==0) && (b==1) && (c==1)) THEN x=1
ELSE IF ((a==0) && (b==0) && (c==1)) THEN x=2-
и так далее
Предположим, я мог бы заменить все эти IF с одной математической функцией, такой как
x = a * n1 + b * n2 + c * n3
(это просто для того, чтобы дать вам представление, на самом деле это более сложно, но также и IF и операнды намного больше)
Функция происходит от ранее обученной искусственной нейронной сети.
У меня такое ощущение, что когда дело доходит до выполнения, функция должна занимать намного меньше времени, чем IF, но это просто внутреннее чувство, которое исходит из моего старого опыта в ассемблере, где они учили нас, что условная инструкция занимает намного больше времени, чем арифметический
Вы можете это подтвердить? Может быть, даже предоставить мне ссылку, где я мог бы найти объяснение?
Заранее спасибо, ребята!
Ваше внутреннее чувство правильно.
Проблема в том, что современные процессоры имеют конвейер, а в конвейере следующий Икс инструкции загружаются последовательно и готовы к выполнению. Если у вас есть ветвь, оператор if, тогда процессор не знает, какой путь кода вы будете использовать следующим, и поэтому он догадывается, используя предсказатель ветви, но если он ошибается, он должен выбросить весь конвейер и начать снова с правильной ветви.
Предсказатели ветвления в современных процессорах довольно хороши, но если у вас есть что-то, что имеет 50/50 шансов пойти тем или иным путем, у вас будет много конвейерных остановок.
Вот почему устранение, если операторы хороши, особенно в тесных циклах.
Кажется, у этого есть хорошее объяснение: http://igoro.com/archive/fast-and-slow-if-statements-branch-prediction-in-modern-processors/
Других решений пока нет …